Compare commits
No commits in common. "ff0ec641d283f3451fe26800fb53f94b66b0a78b" and "97e7881dbe5ac20f280b35e8da38c344af18f583" have entirely different histories.
ff0ec641d2
...
97e7881dbe
|
@ -1,5 +1,12 @@
|
|||
\m4_TLV_version 1d: tl-x.org
|
||||
\SV
|
||||
|
||||
// =========================================
|
||||
// Welcome! Try the tutorials via the menu.
|
||||
// =========================================
|
||||
|
||||
// Default Makerchip TL-Verilog Code Template
|
||||
|
||||
// Macro providing required top-level module definition, random
|
||||
// stimulus support, and Verilator config.
|
||||
m4_makerchip_module // (Expanded in Nav-TLV pane.)
|
||||
|
@ -7,13 +14,13 @@
|
|||
|
||||
// Visualization for calculator
|
||||
\TLV calc_viz()
|
||||
// m4_ifelse_block(m4_sp_graph_dangerous, 1, , {{
|
||||
\SV_plus
|
||||
logic sticky_zero;
|
||||
assign sticky_zero = 0;
|
||||
/view
|
||||
\viz_js
|
||||
box: {strokeWidth: 0},
|
||||
init() {
|
||||
\viz_alpha
|
||||
initEach() {
|
||||
let hexcalname = new fabric.Text("HEX Calc 3000", {
|
||||
left: -150 + 150,
|
||||
top: -150 + 40,
|
||||
|
@ -150,7 +157,7 @@
|
|||
fontSize: 22,
|
||||
fontFamily: "Courier New",
|
||||
})
|
||||
this.missing = new fabric.Text("", {
|
||||
let missing = new fabric.Text("", {
|
||||
top: 360,
|
||||
left: -160,
|
||||
fontSize: 16,
|
||||
|
@ -175,23 +182,24 @@
|
|||
height: 300,
|
||||
stroke: "black"
|
||||
}),
|
||||
this.missing
|
||||
missing
|
||||
],
|
||||
{visible: false}
|
||||
)
|
||||
|
||||
return {calbox, val1box, val1num, val2box, val2num,
|
||||
return {missing,
|
||||
objects: {calbox, val1box, val1num, val2box, val2num,
|
||||
outbox, outnum, equalname, sumbox, minbox, prodbox, quotbox, sumicon,
|
||||
prodicon, minicon: minicon, quoticon: quoticon, hexcalname, missing_sigs}
|
||||
prodicon, minicon: minicon, quoticon: quoticon, hexcalname, missing_sigs}};
|
||||
},
|
||||
render() {
|
||||
renderEach() {
|
||||
let missing_list = "";
|
||||
let sig_names = ["op", "val1", "val2", "out"];
|
||||
let sticky_zero = this.svSigRef(`sticky_zero`);
|
||||
getSig = (name) => {
|
||||
let sig = this.svSigRef(`L0_${name}_a0`);
|
||||
if (sig == null) {
|
||||
missing_list += `◾ $${name} \n`;
|
||||
missing_list += `◾ ${name} \n`;
|
||||
sig = sticky_zero;
|
||||
}
|
||||
return sig;
|
||||
|
@ -200,18 +208,18 @@
|
|||
result[sig_name] = getSig(sig_name)
|
||||
return result
|
||||
}, {})
|
||||
this.getObjects().val1num.set({text: sigs.val1.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
this.getObjects().val2num.set({text: sigs.val2.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
this.getObjects().outnum.set({text: sigs.out.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
this.getInitObject("val1num").set({text: sigs.val1.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
this.getInitObject("val2num").set({text: sigs.val2.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
this.getInitObject("outnum").set({text: sigs.out.asInt(NaN).toString(16).padStart(8, " ")})
|
||||
let op = sigs.op.asInt(NaN)
|
||||
this.getObjects().sumbox.set({fill: op == 0 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getObjects().minbox.set({fill: op == 1 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getObjects().prodbox.set({fill: op == 2 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getObjects().quotbox.set({fill: op == 3 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getInitObject("sumbox").set({fill: op == 0 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getInitObject("minbox").set({fill: op == 1 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getInitObject("prodbox").set({fill: op == 2 ? "#c0d0e0" : "#a0a0a0"})
|
||||
this.getInitObject("quotbox").set({fill: op == 3 ? "#c0d0e0" : "#a0a0a0"})
|
||||
if (missing_list) {
|
||||
this.getObjects().calbox.set({fill: "red"})
|
||||
this.getObjects().missing_sigs.set({visible:true})
|
||||
this.missing.set({text: missing_list})
|
||||
this.getInitObject("calbox").set({fill: "red"})
|
||||
this.getInitObject("missing_sigs").set({visible:true})
|
||||
this.fromInit().missing.set({text: missing_list})
|
||||
}
|
||||
}
|
||||
\TLV
|
||||
|
|
|
@ -142,9 +142,11 @@ m4+definitions(['
|
|||
$_port3_data[_width-1:0] = $rf1_rd_en2 ? /xreg[$rf1_rd_index2]$value : 'X;
|
||||
|
||||
/xreg[m4_eval(_entries-1):0]
|
||||
\viz_js
|
||||
box: {width: 120, height: 18, strokeWidth: 0},
|
||||
render() {
|
||||
\viz_alpha
|
||||
initEach: function() {
|
||||
return {} // {objects: {reg: reg}};
|
||||
},
|
||||
renderEach: function() {
|
||||
siggen = (name) => this.svSigRef(`${name}`) == null ? this.svSigRef(`sticky_zero`) : this.svSigRef(`${name}`);
|
||||
|
||||
let rf_rd_en1 = siggen(`L0_rf1_rd_en1_a0`)
|
||||
|
@ -163,8 +165,8 @@ m4+definitions(['
|
|||
let regIdent = reg.toString().padEnd(2, " ")
|
||||
let newValStr = (regIdent + ": ").padEnd(14, " ")
|
||||
let reg_str = new fabric.Text((regIdent + ": " + value.asInt(NaN).toString(M4_VIZ_BASE)).padEnd(14, " "), {
|
||||
top: 0,
|
||||
left: 0,
|
||||
top: 18 * this.getIndex() - 40,
|
||||
left: 316,
|
||||
fontSize: 14,
|
||||
fill: mod ? "blue" : "black",
|
||||
fontWeight: mod ? 800 : 400,
|
||||
|
@ -177,9 +179,8 @@ m4+definitions(['
|
|||
this.global.canvas.renderAll()
|
||||
}, 1500)
|
||||
}
|
||||
return [reg_str]
|
||||
},
|
||||
where: {left: 316, top: -40}
|
||||
return {objects: [reg_str]}
|
||||
}
|
||||
|
||||
// Data Memory
|
||||
\TLV dmem(_entries, _width, $_reset, $_addr, $_port1_en, $_port1_data, $_port2_en, $_port2_data)
|
||||
|
@ -198,9 +199,11 @@ m4+definitions(['
|
|||
|
||||
$_port2_data[_width-1:0] = $dmem1_rd_en ? /dmem[$dmem1_addr]$value : 'X;
|
||||
/dmem[m4_eval(_entries-1):0]
|
||||
\viz_js
|
||||
box: {width: 120, height: 18, strokeWidth: 0},
|
||||
render() {
|
||||
\viz_alpha
|
||||
initEach: function() {
|
||||
return {} // {objects: {reg: reg}};
|
||||
},
|
||||
renderEach: function() {
|
||||
siggen = (name) => this.svSigRef(`${name}`) == null ? this.svSigRef(`sticky_zero`) : this.svSigRef(`${name}`);
|
||||
//
|
||||
let dmem_rd_en = siggen(`L0_dmem1_rd_en_a0`);
|
||||
|
@ -215,8 +218,8 @@ m4+definitions(['
|
|||
let regIdent = reg.toString().padEnd(2, " ");
|
||||
let newValStr = (regIdent + ": ").padEnd(14, " ");
|
||||
let dmem_str = new fabric.Text((regIdent + ": " + value.asInt(NaN).toString(M4_VIZ_BASE)).padEnd(14, " "), {
|
||||
top: 0,
|
||||
left: 0,
|
||||
top: 18 * this.getIndex() - 40,
|
||||
left: 480,
|
||||
fontSize: 14,
|
||||
fill: mod ? "blue" : "black",
|
||||
fontWeight: mod ? 800 : 400,
|
||||
|
@ -229,9 +232,8 @@ m4+definitions(['
|
|||
this.global.canvas.renderAll()
|
||||
}, 1500)
|
||||
}
|
||||
return [dmem_str]
|
||||
},
|
||||
where: {left: 480, top: -40}
|
||||
return {objects: [dmem_str]}
|
||||
}
|
||||
|
||||
\TLV cpu_viz()
|
||||
// String representations of the instructions for debug.
|
||||
|
@ -243,10 +245,10 @@ m4+definitions(['
|
|||
logic [40*8-1:0] instr_strs [0:M4_NUM_INSTRS];
|
||||
assign instr_strs = '{m4_asm_mem_expr "END "};
|
||||
|
||||
\viz_js
|
||||
/cpuviz
|
||||
\viz_alpha
|
||||
m4_define(['M4_IMEM_TOP'], ['m4_ifelse(m4_eval(M4_NUM_INSTRS > 16), 0, 0, m4_eval(0 - (M4_NUM_INSTRS - 16) * 18))'])
|
||||
box: {strokeWidth: 0},
|
||||
init() {
|
||||
initEach() {
|
||||
let imem_box = new fabric.Rect({
|
||||
top: M4_IMEM_TOP - 50,
|
||||
left: -700,
|
||||
|
@ -326,7 +328,7 @@ m4+definitions(['
|
|||
fontSize: 46,
|
||||
fontWeight: 800
|
||||
})
|
||||
this.missing_col1 = new fabric.Text("", {
|
||||
let missing_col1 = new fabric.Text("", {
|
||||
top: 420,
|
||||
left: -480,
|
||||
fontSize: 16,
|
||||
|
@ -334,7 +336,7 @@ m4+definitions(['
|
|||
fontFamily: "monospace",
|
||||
fill: "purple"
|
||||
})
|
||||
this.missing_col2 = new fabric.Text("", {
|
||||
let missing_col2 = new fabric.Text("", {
|
||||
top: 420,
|
||||
left: -300,
|
||||
fontSize: 16,
|
||||
|
@ -359,14 +361,15 @@ m4+definitions(['
|
|||
height: 300,
|
||||
stroke: "black"
|
||||
}),
|
||||
this.missing_col1,
|
||||
this.missing_col2,
|
||||
missing_col1,
|
||||
missing_col2,
|
||||
],
|
||||
{visible: false}
|
||||
)
|
||||
return {imem_box, decode_box, rf_box, dmem_box, imem_header, decode_header, rf_header, dmem_header, passed, missing_sigs}
|
||||
return {missing_col1, missing_col2,
|
||||
objects: {imem_box, decode_box, rf_box, dmem_box, imem_header, decode_header, rf_header, dmem_header, passed, missing_sigs}};
|
||||
},
|
||||
render() {
|
||||
renderEach() {
|
||||
// Strings (2 columns) of missing signals.
|
||||
var missing_list = ["", ""]
|
||||
var missing_cnt = 0
|
||||
|
@ -436,10 +439,10 @@ m4+definitions(['
|
|||
let dmem_addr = siggen_rf_dmem("dmem1_addr")
|
||||
|
||||
if (instr != sticky_zero) {
|
||||
this.getObjects().imem_box.set({visible: true})
|
||||
this.getObjects().imem_header.set({visible: true})
|
||||
this.getObjects().decode_box.set({visible: true})
|
||||
this.getObjects().decode_header.set({visible: true})
|
||||
this.getInitObjects().imem_box.setVisible(true)
|
||||
this.getInitObjects().imem_header.setVisible(true)
|
||||
this.getInitObjects().decode_box.setVisible(true)
|
||||
this.getInitObjects().decode_header.setVisible(true)
|
||||
}
|
||||
let pcPointer = new fabric.Text("👉", {
|
||||
top: M4_IMEM_TOP + 18 * (pc.asInt() / 4),
|
||||
|
@ -496,12 +499,12 @@ m4+definitions(['
|
|||
visible: dmem_wr_en.asBool()
|
||||
})
|
||||
if (rf_rd_en1 != sticky_zero) {
|
||||
this.getObjects().rf_box.set({visible: true})
|
||||
this.getObjects().rf_header.set({visible: true})
|
||||
this.getInitObjects().rf_box.setVisible(true)
|
||||
this.getInitObjects().rf_header.setVisible(true)
|
||||
}
|
||||
if (dmem_rd_en != sticky_zero) {
|
||||
this.getObjects().dmem_box.set({visible: true})
|
||||
this.getObjects().dmem_header.set({visible: true})
|
||||
this.getInitObjects().dmem_box.setVisible(true)
|
||||
this.getInitObjects().dmem_header.setVisible(true)
|
||||
}
|
||||
|
||||
|
||||
|
@ -588,13 +591,13 @@ m4+definitions(['
|
|||
})
|
||||
if (dmem_rd_en.asBool()) {
|
||||
setTimeout(() => {
|
||||
load_viz.set({visible: true})
|
||||
load_viz.setVisible(true)
|
||||
load_viz.animate({left: 146, top: 70}, {
|
||||
onChange: this.global.canvas.renderAll.bind(this.global.canvas),
|
||||
duration: 500
|
||||
})
|
||||
setTimeout(() => {
|
||||
load_viz.set({visible: false})
|
||||
load_viz.setVisible(false)
|
||||
}, 500)
|
||||
}, 500)
|
||||
}
|
||||
|
@ -610,7 +613,7 @@ m4+definitions(['
|
|||
})
|
||||
if (dmem_wr_en.asBool()) {
|
||||
setTimeout(() => {
|
||||
store_viz.set({visible: true})
|
||||
store_viz.setVisible(true)
|
||||
store_viz.animate({left: 515, top: 18 * dmem_addr.asInt() - 40}, {
|
||||
onChange: this.global.canvas.renderAll.bind(this.global.canvas),
|
||||
duration: 500
|
||||
|
@ -638,8 +641,8 @@ m4+definitions(['
|
|||
})
|
||||
if (rd_valid.asBool()) {
|
||||
setTimeout(() => {
|
||||
result_viz.set({visible: rf_wr_data != sticky_zero && rf_wr_en.asBool()})
|
||||
result_shadow.set({visible: result != sticky_zero})
|
||||
result_viz.setVisible(rf_wr_data != sticky_zero && rf_wr_en.asBool())
|
||||
result_shadow.setVisible(result != sticky_zero)
|
||||
result_viz.animate({left: 317 + 8 * 4, top: 18 * rf_wr_index.asInt(0) - 40}, {
|
||||
onChange: this.global.canvas.renderAll.bind(this.global.canvas),
|
||||
duration: 500
|
||||
|
@ -650,16 +653,16 @@ m4+definitions(['
|
|||
// Lab completion
|
||||
|
||||
// Passed?
|
||||
this.getObjects().passed.set({visible: false})
|
||||
this.getInitObject("passed").setVisible(false)
|
||||
if (passed) {
|
||||
if (passed.step(-1).asBool()) {
|
||||
this.getObjects().passed.set({visible: true, text:"Passed !!!", fill: "green"})
|
||||
this.getInitObject("passed").set({visible: true, text:"Passed !!!", fill: "green"})
|
||||
} else {
|
||||
// Using an unstable API, so:
|
||||
try {
|
||||
passed.goToSimEnd().step(-1)
|
||||
if (passed.asBool()) {
|
||||
this.getObjects().passed.set({text:"Sim Passes", visible: true, fill: "lightgray"})
|
||||
this.getInitObject("passed").set({text:"Sim Passes", visible: true, fill: "lightgray"})
|
||||
}
|
||||
} catch(e) {
|
||||
}
|
||||
|
@ -668,54 +671,57 @@ m4+definitions(['
|
|||
|
||||
// Missing signals
|
||||
if (missing_list[0]) {
|
||||
this.getObjects().missing_sigs.set({visible: true})
|
||||
this.missing_col1.set({text: missing_list[0]})
|
||||
this.missing_col2.set({text: missing_list[1]})
|
||||
this.getInitObject("missing_sigs").setVisible(true)
|
||||
this.fromInit().missing_col1.set({text: missing_list[0]})
|
||||
this.fromInit().missing_col2.set({text: missing_list[1]})
|
||||
}
|
||||
return [pcPointer, pc_arrow, ...type_texts, rs1_arrow, rs2_arrow, rd_arrow, instrWithValues, fetch_instr_viz, src1_value_viz, src2_value_viz, result_shadow, result_viz, ld_arrow, st_arrow, load_viz, store_viz]
|
||||
return {objects: [pcPointer, pc_arrow, ...type_texts, rs1_arrow, rs2_arrow, rd_arrow, instrWithValues, fetch_instr_viz, src1_value_viz, src2_value_viz, result_shadow, result_viz, ld_arrow, st_arrow, load_viz, store_viz]};
|
||||
}
|
||||
|
||||
/imem[m4_eval(M4_NUM_INSTRS-1):0]
|
||||
\viz_js
|
||||
box: {width: 630, height: 18, strokeWidth: 0},
|
||||
init() {
|
||||
\viz_alpha
|
||||
initEach() {
|
||||
let binary = new fabric.Text("", {
|
||||
top: 0,
|
||||
left: 0,
|
||||
top: M4_IMEM_TOP + 18 * this.getIndex(),
|
||||
left: -680,
|
||||
fontSize: 14,
|
||||
fontFamily: "monospace",
|
||||
|
||||
})
|
||||
let disassembled = new fabric.Text("", {
|
||||
top: 0,
|
||||
left: 330,
|
||||
top: M4_IMEM_TOP + 18 * this.getIndex(),
|
||||
left: -350,
|
||||
fontSize: 14,
|
||||
fontFamily: "monospace"
|
||||
})
|
||||
return {binary, disassembled}
|
||||
return {objects: {binary, disassembled}}
|
||||
},
|
||||
onTraceData() {
|
||||
renderEach() {
|
||||
// Instruction memory is constant, so just create it once.
|
||||
let reset = this.svSigRef(`L0_reset_a0`)
|
||||
let pc = this.svSigRef(`L0_pc_a0`)
|
||||
let rd_viz = pc && !reset.asBool() && (pc.asInt() >> 2) == this.getIndex()
|
||||
if (!global.instr_mem_drawn) {
|
||||
global.instr_mem_drawn = []
|
||||
}
|
||||
if (!global.instr_mem_drawn[this.getIndex()]) {
|
||||
global.instr_mem_drawn[this.getIndex()] = true
|
||||
|
||||
let instr = this.svSigRef(`instrs(${this.getIndex()})`)
|
||||
if (instr) {
|
||||
let binary_str = instr.goToSimStart().asBinaryStr("")
|
||||
this.getObjects().binary.set({text: binary_str})
|
||||
this.getInitObject("binary").set({text: binary_str})
|
||||
}
|
||||
let disassembled = this.svSigRef(`instr_strs(${this.getIndex()})`)
|
||||
if (disassembled) {
|
||||
let disassembled_str = disassembled.goToSimStart().asString("")
|
||||
disassembled_str = disassembled_str.slice(0, -5)
|
||||
this.getObjects().disassembled.set({text: disassembled_str})
|
||||
this.getInitObject("disassembled").set({text: disassembled_str})
|
||||
}
|
||||
}
|
||||
this.getInitObject("disassembled").set({textBackgroundColor: rd_viz ? "#b0ffff" : "white"})
|
||||
this.getInitObject("binary") .set({textBackgroundColor: rd_viz ? "#b0ffff" : "white"})
|
||||
}
|
||||
},
|
||||
render() {
|
||||
// Instruction memory is constant, so just create it once.
|
||||
let reset = this.svSigRef(`L0_reset_a0`)
|
||||
let pc = this.svSigRef(`L0_pc_a0`)
|
||||
let rd_viz = pc && !reset.asBool() && (pc.asInt() >> 2) == this.getIndex()
|
||||
this.getObjects().disassembled.set({textBackgroundColor: rd_viz ? "#b0ffff" : "white"})
|
||||
this.getObjects().binary .set({textBackgroundColor: rd_viz ? "#b0ffff" : "white"})
|
||||
},
|
||||
where: {left: -680, top: M4_IMEM_TOP}
|
||||
|
||||
\TLV tb()
|
||||
$passed_cond = (/xreg[30]$value == 32'b1) &&
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
// Program counter
|
||||
$next_pc[31:0] = $reset ? 0 :
|
||||
$taken_br ? $br_tgt_pc :
|
||||
$is_jal ? $br_tgt_pc :
|
||||
$is_jalr ? $jalr_tgt_pc :
|
||||
($pc + 4);
|
||||
$pc[31:0] = >>1$next_pc;
|
||||
|
||||
|
@ -94,8 +92,7 @@
|
|||
$is_lui = $dec_bits ==? 11'bx_xxx_011_0111;
|
||||
$is_auipc = $dec_bits ==? 11'bx_xxx_001_0111;
|
||||
$is_jal = $dec_bits ==? 11'bx_xxx_110_1111;
|
||||
$is_jalr = $dec_bits ==? 11'bx_000_110_0111;
|
||||
$is_slti = $dec_bits ==? 11'bx_010_001_0011;
|
||||
$is_slti = $dec_bits ==? 11'bx_010_011_0011;
|
||||
$is_sltiu = $dec_bits ==? 11'bx_011_001_0011;
|
||||
$is_xori = $dec_bits ==? 11'bx_100_001_0011;
|
||||
$is_ori = $dec_bits ==? 11'bx_110_001_0011;
|
||||
|
@ -115,6 +112,7 @@
|
|||
|
||||
// Treat all load and store instructions the same
|
||||
$is_load = $dec_bits ==? 11'bx_xxx_000_0011;
|
||||
$is_s_instr = $dec_bits ==? 11'bx_xxx_010_0011;
|
||||
|
||||
// Compute whether to branch
|
||||
$taken_br = $is_beq ? $src1_value == $src2_value :
|
||||
|
@ -125,50 +123,13 @@
|
|||
$is_bgeu ? $src1_value >= $src2_value :
|
||||
0;
|
||||
|
||||
// Branch/JAL target
|
||||
// Branch target
|
||||
$br_tgt_pc[31:0] = $pc + $imm;
|
||||
|
||||
// Jump and link register target
|
||||
$jalr_tgt_pc[31:0] = $src1_value + $imm;
|
||||
|
||||
// Arithmetic Logic Unit
|
||||
$sltu_rslt[31:0] = {31'b0, $src1_value < $src2_value};
|
||||
$sltiu_rslt[31:0] = {31'b0, $src1_value < $imm};
|
||||
|
||||
$sext_src1[63:0] = { {32{$src1_value[31]}}, $src1_value };
|
||||
$sra_rslt[63:0] = $sext_src1 >> $src2_value[4:0];
|
||||
$srai_rslt[63:0] = $sext_src1 >> $imm[4:0];
|
||||
|
||||
$result[31:0] =
|
||||
$is_andi ? $src1_value & $imm :
|
||||
$is_ori ? $src1_value | $imm :
|
||||
$is_xori ? $src1_value ^ $imm :
|
||||
$is_addi ? $src1_value + $imm :
|
||||
$is_slli ? $src1_value << $imm[5:0] :
|
||||
$is_srli ? $src1_value >> $imm[5:0] :
|
||||
$is_and ? $src1_value & $src2_value :
|
||||
$is_or ? $src1_value | $src2_value :
|
||||
$is_xor ? $src1_value ^ $src2_value :
|
||||
$is_add ? $src1_value + $src2_value :
|
||||
$is_sub ? $src1_value - $src2_value :
|
||||
$is_sll ? $src1_value << $src2_value[4:0] :
|
||||
$is_srl ? $src1_value >> $src2_value[4:0] :
|
||||
$is_sltu ? $sltu_rslt :
|
||||
$is_sltiu ? $sltiu_rslt :
|
||||
$is_lui ? {$imm[31:12], 12'b0} :
|
||||
$is_auipc ? $pc + $imm :
|
||||
$is_jal ? $pc + 32'd4 :
|
||||
$is_jalr ? $pc + 32'd4 :
|
||||
$is_slt ? ( ($src1_value[31] == $src2_value[31]) ?
|
||||
$sltu_rslt :
|
||||
{31'b0, $src1_value[31]} ) :
|
||||
$is_slti ? ( ($src1_value[31] == $imm[31]) ?
|
||||
$sltiu_rslt :
|
||||
{31'b0, $src1_value[31]} ) :
|
||||
$is_sra ? $sra_rslt[31:0] :
|
||||
$is_srai ? $srai_rslt[31:0] :
|
||||
$is_load ? $src1_value + $imm :
|
||||
$is_s_instr ? $src1_value + $imm :
|
||||
32'b0;
|
||||
|
||||
// Assert these to end simulation (before Makerchip cycle limit).
|
||||
|
@ -176,9 +137,8 @@
|
|||
*failed = *cyc_cnt > M4_MAX_CYC;
|
||||
|
||||
// Register file
|
||||
$rf_data[31:0] = $is_load ? $ld_data : $result;
|
||||
m4+rf(32, 32, $reset, $rd_valid, $rd[4:0], $rf_data, $rs1_valid, $rs1[4:0], $src1_value, $rs2_valid, $rs2[4:0], $src2_value)
|
||||
m4+dmem(32, 32, $reset, $result[4:0], $is_s_instr, $src2_value, $is_load, $ld_data)
|
||||
m4+rf(32, 32, $reset, $rd_valid, $rd[4:0], $result, $rs1_valid, $rs1[4:0], $src1_value, $rs2_valid, $rs2[4:0], $src2_value)
|
||||
//m4+dmem(32, 32, $reset, $addr[4:0], $wr_en, $wr_data[31:0], $rd_en, $rd_data)
|
||||
m4+cpu_viz()
|
||||
\SV
|
||||
endmodule
|
||||
|
|
Loading…
Reference in New Issue