Skip to content

Commit

Permalink
Merge pull request #395 from HyperDbg/hwdbg-script
Browse files Browse the repository at this point in the history
Hwdbg script
  • Loading branch information
SinaKarvandi committed Jun 19, 2024
2 parents 2aeaa39 + 16cc1e1 commit 0963819
Show file tree
Hide file tree
Showing 7 changed files with 175 additions and 143 deletions.
Original file line number Diff line number Diff line change
@@ -1,53 +1,53 @@
Content of BRAM after emulation:

PS to PL area:
mem_0: 000000e2 | Checksum
mem_0: 00000097 | Checksum
mem_1: 00000000 | Checksum
mem_2: 52444247 | Indicator
mem_3: 48595045 | Indicator
mem_4: 00000004 | TypeOfThePacket
mem_5: 00000002 | RequestedActionOfThePacket
mem_6: 0000000f | Start of Optional Data
mem_6: 00000013 | Start of Optional Data
mem_7: 00000005
mem_8: 00000010
mem_8: 0000001d
mem_9: 00000002
mem_10: 00000055
mem_11: 00000003
mem_11: 00000000
mem_12: 00000000
mem_13: 00000006
mem_14: 00000000
mem_13: 00000003
mem_14: 00000001
mem_15: 00000005
mem_16: 00000016
mem_16: 0000001d
mem_17: 00000002
mem_18: 0000000c
mem_19: 00000006
mem_18: 00000000
mem_19: 00000000
mem_20: 00000000
mem_21: 00000000
mem_22: 00000000
mem_21: 00000003
mem_22: 00000002
mem_23: 00000005
mem_24: 0000001d
mem_25: 00000002
mem_26: 00000085
mem_26: 00000000
mem_27: 00000000
mem_28: 00000000
mem_29: 00000003
mem_30: 00000000
mem_30: 00000003
mem_31: 00000005
mem_32: 00000015
mem_32: 0000001d
mem_33: 00000002
mem_34: 0000000c
mem_34: 00000000
mem_35: 00000000
mem_36: 00000000
mem_37: 00000000
mem_38: 00000000
mem_39: 00000000
mem_40: 00000000
mem_41: 00000000
mem_37: 00000003
mem_38: 00000005
mem_39: 00000005
mem_40: 0000001d
mem_41: 00000002
mem_42: 00000000
mem_43: 00000000
mem_44: 00000000
mem_45: 00000000
mem_46: 00000000
mem_45: 00000003
mem_46: 00000006
mem_47: 00000000
mem_48: 00000000
mem_49: 00000000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,28 +227,35 @@ def print_bram_content(dut):


#
# Define a function to extract content of symbol
# Define a function to extract value of symbol
#
def get_symbol_type_and_value(dut, value, type):
def get_symbol_value(dut, value):
element_value = getattr(dut.debuggerMainModule.outputPin_scriptExecutionEngineModule, value)
element_type = getattr(dut.debuggerMainModule.outputPin_scriptExecutionEngineModule, type)

hex_string_value = ""
hex_string_type = ""
try:
int_content_value = int(str(element_value.value), 2)
int_content_type = int(str(element_type.value), 2)

hex_string_value = f'{int_content_value:x}'
hex_string_type = f'{int_content_type:x}'
except:
hex_string_value = str(element_value.value)
hex_string_type = str(element_type.value)

final_string_value = f'{value}: 0x{hex_string_value}' + " (bin: " + str(element_value.value) + ")"
return final_string_value

#
# Define a function to extract type of symbol
#
def get_symbol_type(dut, type):
element_type = getattr(dut.debuggerMainModule.outputPin_scriptExecutionEngineModule, type)
hex_string_type = ""
try:
int_content_type = int(str(element_type.value), 2)
hex_string_type = f'{int_content_type:x}'
except:
hex_string_type = str(element_type.value)

final_string_type = f'{type} : 0x{hex_string_type}' + " (bin: " + str(element_type.value) + ")"
return final_string_type

return final_string_value, final_string_type

#
# Define a function to extract content of stages
Expand Down Expand Up @@ -284,14 +291,26 @@ def extract_stage_details(dut):

for index, element in enumerate(sorted_values):

final_string_type, final_string_value = get_symbol_type_and_value(dut, sorted_values[index], sorted_types[index])
try:
final_string_type = get_symbol_type(dut, sorted_types[index])

#
# Print the type
#
print(final_string_type)
except:
print("This stage does not contain a 'type'")

try:
final_string_value = get_symbol_value(dut, sorted_values[index])

#
# Print the value
#
print(final_string_value)
except:
print("Unable to get stage 'value' configuration details")

#
# Print the value and type
#
print(final_string_type)
print(final_string_value)

print("\n")

#
Expand All @@ -305,8 +324,9 @@ def extract_stage_details(dut):
print("\t Stage enabled bit: (unavailable)")

try:
final_string_type, final_string_value = get_symbol_type_and_value(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_0_Value", "stageRegs_" + str(index) + "_getOperatorSymbol_0_Type")

final_string_value = get_symbol_value(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_0_Value")
final_string_type = get_symbol_type(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_0_Type")

print("\t Get (0) | " + final_string_type)
print("\t Get (0) | " + final_string_value)
except:
Expand All @@ -315,8 +335,9 @@ def extract_stage_details(dut):
print("\n")

try:
final_string_type, final_string_value = get_symbol_type_and_value(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_1_Value", "stageRegs_" + str(index) + "_getOperatorSymbol_1_Type")

final_string_value = get_symbol_value(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_1_Value")
final_string_type = get_symbol_type(dut, "stageRegs_" + str(index) + "_getOperatorSymbol_1_Type")

print("\t Get (1) | " + final_string_type)
print("\t Get (1) | " + final_string_value)
except:
Expand All @@ -325,15 +346,50 @@ def extract_stage_details(dut):
print("\n")

try:
final_string_type, final_string_value = get_symbol_type_and_value(dut, "stageRegs_" + str(index) + "_setOperatorSymbol_0_Value", "stageRegs_" + str(index) + "_setOperatorSymbol_0_Type")

final_string_value = get_symbol_value(dut, "stageRegs_" + str(index) + "_setOperatorSymbol_0_Value")
final_string_type = get_symbol_type(dut, "stageRegs_" + str(index) + "_setOperatorSymbol_0_Type")

print("\t Set (0) | " + final_string_type)
print("\t Set (0) | " + final_string_value)
except:
print("\t stage at:" + str(index) + " does not contain a Set (0) buffer")

print("\n\n")


def set_input_pins(dut):
dut.io_inputPin_0.value = 1
dut.io_inputPin_1.value = 1
dut.io_inputPin_2.value = 1
dut.io_inputPin_3.value = 1
dut.io_inputPin_4.value = 1
dut.io_inputPin_5.value = 1
dut.io_inputPin_6.value = 1
dut.io_inputPin_7.value = 1
dut.io_inputPin_8.value = 1
dut.io_inputPin_9.value = 1
dut.io_inputPin_10.value = 1
dut.io_inputPin_11.value = 1
dut.io_inputPin_12.value = 1
dut.io_inputPin_13.value = 1
dut.io_inputPin_14.value = 1
dut.io_inputPin_15.value = 1
dut.io_inputPin_16.value = 1
dut.io_inputPin_17.value = 1
dut.io_inputPin_18.value = 1
dut.io_inputPin_19.value = 1
dut.io_inputPin_20.value = 1
dut.io_inputPin_21.value = 1
dut.io_inputPin_22.value = 1
dut.io_inputPin_23.value = 1
dut.io_inputPin_24.value = 1
dut.io_inputPin_25.value = 1
dut.io_inputPin_26.value = 1
dut.io_inputPin_27.value = 1
dut.io_inputPin_28.value = 1
dut.io_inputPin_29.value = 1
dut.io_inputPin_30.value = 1
dut.io_inputPin_31.value = 1

@cocotb.test()
async def DebuggerModuleTestingBRAM_test(dut):
"""Test hwdbg module (with pre-defined BRAM)"""
Expand Down Expand Up @@ -400,6 +456,7 @@ async def DebuggerModuleTestingBRAM_test(dut):
await Timer(10, units="ns")
dut.reset.value = 0


dut._log.info("Enabling an interrupting chip to receive commands from BRAM")

#
Expand All @@ -410,38 +467,8 @@ async def DebuggerModuleTestingBRAM_test(dut):
#
# Set initial input value to prevent it from floating
#
dut.io_inputPin_0.value = 1
dut.io_inputPin_1.value = 0
dut.io_inputPin_2.value = 1
dut.io_inputPin_3.value = 0
dut.io_inputPin_4.value = 1
dut.io_inputPin_5.value = 0
dut.io_inputPin_6.value = 1
dut.io_inputPin_7.value = 0
dut.io_inputPin_8.value = 1
dut.io_inputPin_9.value = 0
dut.io_inputPin_10.value = 1
dut.io_inputPin_11.value = 0
dut.io_inputPin_12.value = 1
dut.io_inputPin_13.value = 0
dut.io_inputPin_14.value = 1
dut.io_inputPin_15.value = 0
dut.io_inputPin_16.value = 0
dut.io_inputPin_17.value = 0
dut.io_inputPin_18.value = 0
dut.io_inputPin_19.value = 0
dut.io_inputPin_20.value = 0
dut.io_inputPin_21.value = 0
dut.io_inputPin_22.value = 0
dut.io_inputPin_23.value = 0
dut.io_inputPin_24.value = 0
dut.io_inputPin_25.value = 1
dut.io_inputPin_26.value = 1
dut.io_inputPin_27.value = 1
dut.io_inputPin_28.value = 1
dut.io_inputPin_29.value = 1
dut.io_inputPin_30.value = 1
dut.io_inputPin_31.value = 1
dut._log.info("Initializing input pins")
# set_input_pins(dut)

#
# Tell the hwdbg to receive BRAM results
Expand Down Expand Up @@ -507,5 +534,6 @@ async def DebuggerModuleTestingBRAM_test(dut):
# Check the final input on the next clock and run the circuit for a couple
# of more clock cycles
#
for _ in range(10):
for _ in range(100):
set_input_pins(dut)
await Timer(10, units="ns")
25 changes: 17 additions & 8 deletions hwdbg/src/main/scala/hwdbg/script/eval.scala
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ class ScriptEngineEval(
val outputPin = Output(Vec(instanceInfo.numberOfPins, UInt(1.W))) // output pins
})


//-------------------------------------------------------------------------
//
// Output pins
//
val nextStage = WireInit(0.U(log2Ceil(instanceInfo.maximumNumberOfStages).W))
val ignoreStageChange = WireInit(false.B)

//
// Assign operator value (split the signal into only usable part)
Expand Down Expand Up @@ -87,7 +87,6 @@ class ScriptEngineEval(
//
val srcVal = WireInit(VecInit(Seq.fill(instanceInfo.maximumNumberOfSupportedGetScriptOperators)(0.U(instanceInfo.scriptVariableLength.W))))
val desVal = WireInit(VecInit(Seq.fill(instanceInfo.maximumNumberOfSupportedSetScriptOperators)(0.U(instanceInfo.scriptVariableLength.W))))


//
// Apply the chip enable signal
Expand Down Expand Up @@ -210,6 +209,8 @@ class ScriptEngineEval(
srcVal(0) := getValueModuleOutput(0)

nextStage := srcVal(0)

ignoreStageChange := true.B
}
}
is(sFuncJz) {
Expand All @@ -218,7 +219,10 @@ class ScriptEngineEval(
srcVal(0) := getValueModuleOutput(0)
srcVal(1) := getValueModuleOutput(1)

when (srcVal(1) === 0.U) { nextStage := srcVal(0) }
when (srcVal(1) === 0.U) {
nextStage := srcVal(0)
ignoreStageChange := true.B
}

}
}
Expand All @@ -228,7 +232,10 @@ class ScriptEngineEval(
srcVal(0) := getValueModuleOutput(0)
srcVal(1) := getValueModuleOutput(1)

when (srcVal(1) =/= 0.U) { nextStage := srcVal(0) }
when (srcVal(1) =/= 0.U) {
nextStage := srcVal(0)
ignoreStageChange := true.B
}

}
}
Expand Down Expand Up @@ -264,10 +271,12 @@ class ScriptEngineEval(
// ---------------------------------------------------------------------

//
// Increment the stage
// Increment the stage if there is no jump
//
// nextStage := io.currentStage + 1.U

when (ignoreStageChange === false.B) {
nextStage := io.stageConfig.targetStage + 1.U
}

//
// Connect the output signals
//
Expand Down
Loading

0 comments on commit 0963819

Please sign in to comment.