mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
removed minor bugs
This commit is contained in:
parent
139c2076a1
commit
cc988f420f
@ -508,7 +508,7 @@ module testbench_busybear();
|
|||||||
// Track names of instructions
|
// Track names of instructions
|
||||||
string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName;
|
string InstrFName, InstrDName, InstrEName, InstrMName, InstrWName;
|
||||||
logic [31:0] InstrW;
|
logic [31:0] InstrW;
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
instrNameDecTB dec(dut.hart.ifu.InstrF, InstrFName);
|
instrNameDecTB dec(dut.hart.ifu.InstrF, InstrFName);
|
||||||
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
||||||
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
||||||
@ -522,3 +522,128 @@ module testbench_busybear();
|
|||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
module instrTrackerTB(
|
||||||
|
input logic clk, reset, FlushE,
|
||||||
|
input logic [31:0] InstrD,
|
||||||
|
input logic [31:0] InstrE, InstrM,
|
||||||
|
output logic [31:0] InstrW,
|
||||||
|
output string InstrDName, InstrEName, InstrMName, InstrWName);
|
||||||
|
|
||||||
|
// stage Instr to Writeback for visualization
|
||||||
|
//flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
||||||
|
|
||||||
|
instrNameDecTB ddec(InstrD, InstrDName);
|
||||||
|
instrNameDecTB edec(InstrE, InstrEName);
|
||||||
|
instrNameDecTB mdec(InstrM, InstrMName);
|
||||||
|
instrNameDecTB wdec(InstrW, InstrWName);
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// decode the instruction name, to help the test bench
|
||||||
|
module instrNameDecTB(
|
||||||
|
input logic [31:0] instr,
|
||||||
|
output string name);
|
||||||
|
|
||||||
|
logic [6:0] op;
|
||||||
|
logic [2:0] funct3;
|
||||||
|
logic [6:0] funct7;
|
||||||
|
logic [11:0] imm;
|
||||||
|
|
||||||
|
assign op = instr[6:0];
|
||||||
|
assign funct3 = instr[14:12];
|
||||||
|
assign funct7 = instr[31:25];
|
||||||
|
assign imm = instr[31:20];
|
||||||
|
|
||||||
|
// it would be nice to add the operands to the name
|
||||||
|
// create another variable called decoded
|
||||||
|
|
||||||
|
always_comb
|
||||||
|
casez({op, funct3})
|
||||||
|
10'b0000000_000: name = "BAD";
|
||||||
|
10'b0000011_000: name = "LB";
|
||||||
|
10'b0000011_001: name = "LH";
|
||||||
|
10'b0000011_010: name = "LW";
|
||||||
|
10'b0000011_011: name = "LD";
|
||||||
|
10'b0000011_100: name = "LBU";
|
||||||
|
10'b0000011_101: name = "LHU";
|
||||||
|
10'b0000011_110: name = "LWU";
|
||||||
|
10'b0010011_000: if (instr[31:15] == 0 && instr[11:7] ==0) name = "NOP/FLUSH";
|
||||||
|
else name = "ADDI";
|
||||||
|
10'b0010011_001: if (funct7[6:1] == 6'b000000) name = "SLLI";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0010011_010: name = "SLTI";
|
||||||
|
10'b0010011_011: name = "SLTIU";
|
||||||
|
10'b0010011_100: name = "XORI";
|
||||||
|
10'b0010011_101: if (funct7[6:1] == 6'b000000) name = "SRLI";
|
||||||
|
else if (funct7[6:1] == 6'b010000) name = "SRAI";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0010011_110: name = "ORI";
|
||||||
|
10'b0010011_111: name = "ANDI";
|
||||||
|
10'b0010111_???: name = "AUIPC";
|
||||||
|
10'b0100011_000: name = "SB";
|
||||||
|
10'b0100011_001: name = "SH";
|
||||||
|
10'b0100011_010: name = "SW";
|
||||||
|
10'b0100011_011: name = "SD";
|
||||||
|
10'b0011011_000: name = "ADDIW";
|
||||||
|
10'b0011011_001: name = "SLLIW";
|
||||||
|
10'b0011011_101: if (funct7 == 7'b0000000) name = "SRLIW";
|
||||||
|
else if (funct7 == 7'b0100000) name = "SRAIW";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0111011_000: if (funct7 == 7'b0000000) name = "ADDW";
|
||||||
|
else if (funct7 == 7'b0100000) name = "SUBW";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0111011_001: name = "SLLW";
|
||||||
|
10'b0111011_101: if (funct7 == 7'b0000000) name = "SRLW";
|
||||||
|
else if (funct7 == 7'b0100000) name = "SRAW";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_000: if (funct7 == 7'b0000000) name = "ADD";
|
||||||
|
else if (funct7 == 7'b0000001) name = "MUL";
|
||||||
|
else if (funct7 == 7'b0100000) name = "SUB";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_001: if (funct7 == 7'b0000000) name = "SLL";
|
||||||
|
else if (funct7 == 7'b0000001) name = "MULH";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_010: if (funct7 == 7'b0000000) name = "SLT";
|
||||||
|
else if (funct7 == 7'b0000001) name = "MULHSU";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_011: if (funct7 == 7'b0000000) name = "SLTU";
|
||||||
|
else if (funct7 == 7'b0000001) name = "DIV";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_100: if (funct7 == 7'b0000000) name = "XOR";
|
||||||
|
else if (funct7 == 7'b0000001) name = "MUL";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_101: if (funct7 == 7'b0000000) name = "SRL";
|
||||||
|
else if (funct7 == 7'b0000001) name = "DIVU";
|
||||||
|
else if (funct7 == 7'b0100000) name = "SRA";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_110: if (funct7 == 7'b0000000) name = "OR";
|
||||||
|
else if (funct7 == 7'b0000001) name = "REM";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110011_111: if (funct7 == 7'b0000000) name = "AND";
|
||||||
|
else if (funct7 == 7'b0000001) name = "REMU";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b0110111_???: name = "LUI";
|
||||||
|
10'b1100011_000: name = "BEQ";
|
||||||
|
10'b1100011_001: name = "BNE";
|
||||||
|
10'b1100011_100: name = "BLT";
|
||||||
|
10'b1100011_101: name = "BGE";
|
||||||
|
10'b1100011_110: name = "BLTU";
|
||||||
|
10'b1100011_111: name = "BGEU";
|
||||||
|
10'b1100111_000: name = "JALR";
|
||||||
|
10'b1101111_???: name = "JAL";
|
||||||
|
10'b1110011_000: if (imm == 0) name = "ECALL";
|
||||||
|
else if (imm == 1) name = "EBREAK";
|
||||||
|
else if (imm == 2) name = "URET";
|
||||||
|
else if (imm == 258) name = "SRET";
|
||||||
|
else if (imm == 770) name = "MRET";
|
||||||
|
else name = "ILLEGAL";
|
||||||
|
10'b1110011_001: name = "CSRRW";
|
||||||
|
10'b1110011_010: name = "CSRRS";
|
||||||
|
10'b1110011_011: name = "CSRRC";
|
||||||
|
10'b1110011_101: name = "CSRRWI";
|
||||||
|
10'b1110011_110: name = "CSRRSI";
|
||||||
|
10'b1110011_111: name = "CSRRCI";
|
||||||
|
10'b0001111_???: name = "FENCE";
|
||||||
|
default: name = "ILLEGAL";
|
||||||
|
endcase
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ module testbench();
|
|||||||
wallypipelinedsoc dut(.*);
|
wallypipelinedsoc dut(.*);
|
||||||
// Track names of instructions
|
// Track names of instructions
|
||||||
logic [31:0] InstrW;
|
logic [31:0] InstrW;
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
||||||
dut.hart.ifu.InstrF,
|
dut.hart.ifu.InstrF,
|
||||||
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
||||||
|
@ -61,7 +61,7 @@ module testbench();
|
|||||||
wallypipelinedsoc dut(.*);
|
wallypipelinedsoc dut(.*);
|
||||||
|
|
||||||
logic [31:0] InstrW;
|
logic [31:0] InstrW;
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
|
|
||||||
// Track names of instructions
|
// Track names of instructions
|
||||||
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
||||||
|
@ -334,8 +334,8 @@ string tests32i[] = {
|
|||||||
logic HCLK, HRESETn;
|
logic HCLK, HRESETn;
|
||||||
logic [`XLEN-1:0] PCW;
|
logic [`XLEN-1:0] PCW;
|
||||||
|
|
||||||
flopenr #(`XLEN) PCWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.ifu.PCM, PCW);
|
flopenr #(`XLEN) PCWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.PCM, PCW);
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
// pick tests based on modes supported
|
// pick tests based on modes supported
|
||||||
initial
|
initial
|
||||||
if (`XLEN == 64) begin // RV64
|
if (`XLEN == 64) begin // RV64
|
||||||
|
@ -73,7 +73,7 @@ module testbench();
|
|||||||
assign HRDATAEXT = 0;
|
assign HRDATAEXT = 0;
|
||||||
|
|
||||||
wallypipelinedsoc dut(.*);
|
wallypipelinedsoc dut(.*);
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
// Track names of instructions
|
// Track names of instructions
|
||||||
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
||||||
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
||||||
@ -189,7 +189,7 @@ module instrTrackerTB(
|
|||||||
output string InstrDName, InstrEName, InstrMName, InstrWName);
|
output string InstrDName, InstrEName, InstrMName, InstrWName);
|
||||||
|
|
||||||
// stage Instr to Writeback for visualization
|
// stage Instr to Writeback for visualization
|
||||||
flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
//flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
||||||
|
|
||||||
instrNameDecTB ddec(InstrD, InstrDName);
|
instrNameDecTB ddec(InstrD, InstrDName);
|
||||||
instrNameDecTB edec(InstrE, InstrEName);
|
instrNameDecTB edec(InstrE, InstrEName);
|
||||||
|
@ -73,7 +73,7 @@ module testbench();
|
|||||||
assign HRDATAEXT = 0;
|
assign HRDATAEXT = 0;
|
||||||
|
|
||||||
wallypipelinedsoc dut(.*);
|
wallypipelinedsoc dut(.*);
|
||||||
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.hazard.StallW, dut.hart.hazard.FlushW ? nop : dut.hart.ifu.InstrM, InstrW);
|
flopenr #(32) InstrWReg(clk, reset, ~dut.hart.ieu.dp.StallW, dut.hart.ifu.InstrM, InstrW);
|
||||||
// Track names of instructions
|
// Track names of instructions
|
||||||
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
instrTrackerTB it(clk, reset, dut.hart.ieu.dp.FlushE,
|
||||||
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
dut.hart.ifu.InstrD, dut.hart.ifu.InstrE,
|
||||||
@ -189,7 +189,7 @@ module instrTrackerTB(
|
|||||||
output string InstrDName, InstrEName, InstrMName, InstrWName);
|
output string InstrDName, InstrEName, InstrMName, InstrWName);
|
||||||
|
|
||||||
// stage Instr to Writeback for visualization
|
// stage Instr to Writeback for visualization
|
||||||
flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
//flopr #(32) InstrWReg(clk, reset, InstrM, InstrW);
|
||||||
|
|
||||||
instrNameDecTB ddec(InstrD, InstrDName);
|
instrNameDecTB ddec(InstrD, InstrDName);
|
||||||
instrNameDecTB edec(InstrE, InstrEName);
|
instrNameDecTB edec(InstrE, InstrEName);
|
||||||
|
Loading…
Reference in New Issue
Block a user