mirror of
https://gitlab.com/brendanhaines/cpu.git
synced 2024-12-26 19:16:48 -07:00
passes quick test: beq, blt, bltu
This commit is contained in:
parent
06d0e07c61
commit
6e0d9c96a1
27
hdl/core.v
27
hdl/core.v
|
@ -91,7 +91,8 @@ reg r_ex_load, r_mem_load;
|
||||||
reg [31:0] r_mem_wdata, r_wb_wdata;
|
reg [31:0] r_mem_wdata, r_wb_wdata;
|
||||||
reg r_id_valid=0, r_ex_valid=0, r_mem_valid=0, r_wb_valid=0;
|
reg r_id_valid=0, r_ex_valid=0, r_mem_valid=0, r_wb_valid=0;
|
||||||
reg r_ex_branch_pol;
|
reg r_ex_branch_pol;
|
||||||
reg r_ex_branch;
|
reg r_ex_branch, r_mem_branch, r_wb_branch;
|
||||||
|
reg [31:0] r_ex_immed_btype;
|
||||||
|
|
||||||
// IF
|
// IF
|
||||||
reg s_if_stall = 0;
|
reg s_if_stall = 0;
|
||||||
|
@ -101,12 +102,10 @@ reg [31:0] s_if_inst;
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
s_if_stall = s_id_stall;
|
s_if_stall = s_id_stall;
|
||||||
|
|
||||||
if (s_ex_take_branch && r_ex_valid) begin
|
if (s_ex_take_branch) begin
|
||||||
s_if_next_pc = s_ex_alu_out;
|
s_if_next_pc = s_ex_branch_addr;
|
||||||
// s_if_stall = 1'b1;
|
|
||||||
end else begin
|
end else begin
|
||||||
s_if_next_pc = r_if_pc + 4;
|
s_if_next_pc = r_if_pc + 4;
|
||||||
// s_if_stall = 1'b0;
|
|
||||||
end
|
end
|
||||||
|
|
||||||
mem_inst_addr = r_if_pc;
|
mem_inst_addr = r_if_pc;
|
||||||
|
@ -289,7 +288,7 @@ always @(*) begin
|
||||||
endcase
|
endcase
|
||||||
|
|
||||||
s_id_stall = s_ex_stall ||
|
s_id_stall = s_ex_stall ||
|
||||||
(r_ex_valid &&
|
(r_ex_valid && (s_ex_take_branch == 0) &&
|
||||||
(((r_ex_rd == s_id_rs1) && (s_id_rs1 != 0)) ||
|
(((r_ex_rd == s_id_rs1) && (s_id_rs1 != 0)) ||
|
||||||
((r_ex_rd == s_id_rs2) && (s_id_rs2 != 0)))) ||
|
((r_ex_rd == s_id_rs2) && (s_id_rs2 != 0)))) ||
|
||||||
(r_mem_valid &&
|
(r_mem_valid &&
|
||||||
|
@ -310,9 +309,9 @@ reg s_ex_stall = 0;
|
||||||
reg [31:0] s_ex_data1, s_ex_data2;
|
reg [31:0] s_ex_data1, s_ex_data2;
|
||||||
reg [31:0] s_ex_alu_out;
|
reg [31:0] s_ex_alu_out;
|
||||||
reg s_ex_alu_zero;
|
reg s_ex_alu_zero;
|
||||||
reg [31:0] s_ex_ra;
|
|
||||||
reg [31:0] s_ex_wdata;
|
reg [31:0] s_ex_wdata;
|
||||||
reg s_ex_take_branch;
|
reg s_ex_take_branch;
|
||||||
|
reg [31:0] s_ex_branch_addr;
|
||||||
|
|
||||||
always @(*) begin
|
always @(*) begin
|
||||||
s_ex_stall = s_mem_stall;
|
s_ex_stall = s_mem_stall;
|
||||||
|
@ -358,14 +357,13 @@ always @(*) begin
|
||||||
endcase
|
endcase
|
||||||
s_ex_alu_zero = (s_ex_alu_out == 0);
|
s_ex_alu_zero = (s_ex_alu_out == 0);
|
||||||
|
|
||||||
s_ex_ra = r_ex_pc + 4;
|
s_ex_take_branch = r_ex_valid && (r_ex_jump || (r_ex_branch && (s_ex_alu_zero ^ r_ex_branch_pol)));
|
||||||
// s_ex_branch_addr = r_ex_pc +
|
|
||||||
// TODO: determine and go to branch address (pc+offset)
|
|
||||||
s_ex_take_branch = r_ex_jump || (r_ex_branch && (s_ex_alu_zero ^ r_ex_branch_pol));
|
|
||||||
if (r_ex_jump) begin
|
if (r_ex_jump) begin
|
||||||
s_ex_wdata = s_ex_ra;
|
s_ex_wdata = r_ex_pc + 4;
|
||||||
|
s_ex_branch_addr = s_ex_alu_out;
|
||||||
end else begin
|
end else begin
|
||||||
s_ex_wdata = s_ex_alu_out;
|
s_ex_wdata = s_ex_alu_out;
|
||||||
|
s_ex_branch_addr = r_ex_pc + r_ex_immed_btype;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -402,7 +400,7 @@ always @(*) begin
|
||||||
s_wb_data = r_wb_wdata;
|
s_wb_data = r_wb_wdata;
|
||||||
|
|
||||||
// FIXME: always writes!!!
|
// FIXME: always writes!!!
|
||||||
s_wb_write = 1; //!s_wb_stall;
|
s_wb_write = (r_wb_branch == 0);
|
||||||
end
|
end
|
||||||
|
|
||||||
// SYS
|
// SYS
|
||||||
|
@ -474,6 +472,7 @@ always @(posedge clk) begin: pipeline_update
|
||||||
r_ex_load <= s_id_load;
|
r_ex_load <= s_id_load;
|
||||||
r_ex_valid <= r_id_valid && ~(s_ex_take_branch && r_ex_valid) && ~(s_id_stall && r_id_valid);
|
r_ex_valid <= r_id_valid && ~(s_ex_take_branch && r_ex_valid) && ~(s_id_stall && r_id_valid);
|
||||||
r_ex_branch_pol <= s_id_branch_pol;
|
r_ex_branch_pol <= s_id_branch_pol;
|
||||||
|
r_ex_immed_btype <= s_id_immed_btype;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -490,6 +489,7 @@ always @(posedge clk) begin: pipeline_update
|
||||||
r_mem_load <= r_ex_load;
|
r_mem_load <= r_ex_load;
|
||||||
r_mem_wdata <= s_ex_wdata;
|
r_mem_wdata <= s_ex_wdata;
|
||||||
r_mem_valid <= r_ex_valid;
|
r_mem_valid <= r_ex_valid;
|
||||||
|
r_mem_branch <= r_ex_branch;
|
||||||
end
|
end
|
||||||
|
|
||||||
// WB
|
// WB
|
||||||
|
@ -500,6 +500,7 @@ always @(posedge clk) begin: pipeline_update
|
||||||
r_wb_alu_out <= r_mem_alu_out;
|
r_wb_alu_out <= r_mem_alu_out;
|
||||||
r_wb_wdata <= r_mem_wdata;
|
r_wb_wdata <= r_mem_wdata;
|
||||||
r_wb_valid <= r_mem_valid;
|
r_wb_valid <= r_mem_valid;
|
||||||
|
r_wb_branch <= r_mem_branch;
|
||||||
end
|
end
|
||||||
|
|
||||||
// Register File
|
// Register File
|
||||||
|
|
|
@ -255,6 +255,31 @@
|
||||||
<obj_property name="ObjectShortName">s_id_rs2[4:0]</obj_property>
|
<obj_property name="ObjectShortName">s_id_rs2[4:0]</obj_property>
|
||||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_id_immed_itype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_id_immed_itype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_id_immed_itype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_id_immed_stype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_id_immed_stype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_id_immed_stype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_id_immed_utype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_id_immed_utype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_id_immed_utype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_id_immed_btype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_id_immed_btype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_id_immed_btype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_id_immed_jtype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_id_immed_jtype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_id_immed_jtype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
<wvobject fp_name="/core_tb/dut/s_id_s1" type="array" db_ref_id="1">
|
<wvobject fp_name="/core_tb/dut/s_id_s1" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">s_id_s1[31:0]</obj_property>
|
<obj_property name="ElementShortName">s_id_s1[31:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">s_id_s1[31:0]</obj_property>
|
<obj_property name="ObjectShortName">s_id_s1[31:0]</obj_property>
|
||||||
|
@ -361,6 +386,16 @@
|
||||||
<obj_property name="ElementShortName">s_ex_take_branch</obj_property>
|
<obj_property name="ElementShortName">s_ex_take_branch</obj_property>
|
||||||
<obj_property name="ObjectShortName">s_ex_take_branch</obj_property>
|
<obj_property name="ObjectShortName">s_ex_take_branch</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/r_ex_immed_btype" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">r_ex_immed_btype[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">r_ex_immed_btype[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
|
<wvobject fp_name="/core_tb/dut/s_ex_branch_addr" type="array" db_ref_id="1">
|
||||||
|
<obj_property name="ElementShortName">s_ex_branch_addr[31:0]</obj_property>
|
||||||
|
<obj_property name="ObjectShortName">s_ex_branch_addr[31:0]</obj_property>
|
||||||
|
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||||
|
</wvobject>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="group7" type="group">
|
<wvobject fp_name="group7" type="group">
|
||||||
<obj_property name="label">MEM</obj_property>
|
<obj_property name="label">MEM</obj_property>
|
||||||
|
@ -405,10 +440,6 @@
|
||||||
<obj_property name="ElementShortName">r_wb_valid</obj_property>
|
<obj_property name="ElementShortName">r_wb_valid</obj_property>
|
||||||
<obj_property name="ObjectShortName">r_wb_valid</obj_property>
|
<obj_property name="ObjectShortName">r_wb_valid</obj_property>
|
||||||
</wvobject>
|
</wvobject>
|
||||||
<wvobject fp_name="/core_tb/dut/s_wb_stall" type="logic" db_ref_id="1">
|
|
||||||
<obj_property name="ElementShortName">s_wb_stall</obj_property>
|
|
||||||
<obj_property name="ObjectShortName">s_wb_stall</obj_property>
|
|
||||||
</wvobject>
|
|
||||||
<wvobject fp_name="/core_tb/dut/r_wb_pc" type="array" db_ref_id="1">
|
<wvobject fp_name="/core_tb/dut/r_wb_pc" type="array" db_ref_id="1">
|
||||||
<obj_property name="ElementShortName">r_wb_pc[31:0]</obj_property>
|
<obj_property name="ElementShortName">r_wb_pc[31:0]</obj_property>
|
||||||
<obj_property name="ObjectShortName">r_wb_pc[31:0]</obj_property>
|
<obj_property name="ObjectShortName">r_wb_pc[31:0]</obj_property>
|
||||||
|
|
69
test/test.S
69
test/test.S
|
@ -137,26 +137,49 @@ _start:
|
||||||
# jal
|
# jal
|
||||||
jal x1, test_jalr
|
jal x1, test_jalr
|
||||||
|
|
||||||
# test1:
|
test1:
|
||||||
# # TODO: redo these tests because my nop test messed it up
|
# beq
|
||||||
# # beq
|
addi x30, x0, 1 # x30 = 1
|
||||||
# addi x30, x0, 1 # x30 = 1
|
addi x9, x8, 0 # x9 = 0xffffff00
|
||||||
# addi x9, x8, 0 # x9 == x8
|
bne x0, x0, fail # 0 == 0
|
||||||
# bne x0, x0, fail # 0 == 0
|
bne x9, x8, fail # x9 == x8
|
||||||
# bne x9, x8, fail # x9 == x8
|
bne x7, x8, test2 # x7 != x8
|
||||||
# bne x7, x8, test2 # x7 != x8
|
j fail
|
||||||
# j fail
|
|
||||||
|
|
||||||
# test2:
|
test2:
|
||||||
# # beq
|
# beq
|
||||||
# addi x30, x0, 2 # x30 = 2
|
addi x30, x0, 2 # x30 = 2
|
||||||
# beq x0, x8, fail # 0 != x8
|
beq x0, x8, fail # 0 != x8
|
||||||
# beq x7, x8, fail # x7 != x8
|
beq x7, x8, fail # x7 != x8
|
||||||
# beq x8, x9, test3 # x8 == x9
|
beq x8, x9, test3 # x8 == x9
|
||||||
# j fail
|
j fail
|
||||||
|
|
||||||
# test3:
|
test3:
|
||||||
|
#blt
|
||||||
|
addi x30, x0, 3 # x30 = 3
|
||||||
|
blt x8, x9, fail # x8 == x9
|
||||||
|
blt x7, x8, fail # x7 > x8
|
||||||
|
blt x30, x8, fail # x30 > x8
|
||||||
|
blt x8, x7, test4 # x8 < x7
|
||||||
|
j fail
|
||||||
|
|
||||||
|
test4:
|
||||||
|
#bltu
|
||||||
|
addi x30, x0, 4 # x30 = 4
|
||||||
|
bltu x8, x9, fail # x8 == x9
|
||||||
|
bltu x8, x7, fail # x8 < x7
|
||||||
|
bltu x30, x8, test5 # x30 < x8 unsigned
|
||||||
|
|
||||||
|
test5:
|
||||||
|
addi x30, x0, 5 # x30 = 5
|
||||||
|
|
||||||
|
|
||||||
|
# set registers to known values before loop
|
||||||
|
addi x2, x0, 1 # x1 = 1
|
||||||
|
addi x3, x0, 1 # x1 = 1
|
||||||
|
addi x4, x0, 1 # x1 = 1
|
||||||
|
addi x5, x0, 1 # x1 = 1
|
||||||
|
addi x6, x0, 1 # x1 = 1
|
||||||
|
|
||||||
# counter and infinite loop
|
# counter and infinite loop
|
||||||
addi x31, x0, 1 # x1 = 1
|
addi x31, x0, 1 # x1 = 1
|
||||||
|
@ -182,7 +205,17 @@ test_jalr:
|
||||||
jalr x0, x1, 0 # return
|
jalr x0, x1, 0 # return
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
jal x0, fail # loop forever
|
# set some registers to make it blatantly obvious an error occurred
|
||||||
|
addi x1, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x2, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x3, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x4, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x5, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x6, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x7, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x8, x0, 0x7ff # x1 = 0x1111
|
||||||
|
addi x9, x0, 0x7ff # x1 = 0x1111
|
||||||
|
j fail # loop forever
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
|
Loading…
Reference in New Issue
Block a user