Cleaned up the interface between BIU and the processor

This commit is contained in:
(Tim) Efthimis Kritikos 2023-05-16 13:33:08 +01:00
parent 07d2a80b2e
commit bfa576e2a0
5 changed files with 53 additions and 66 deletions

View File

@ -1,15 +1,15 @@
[*]
[*] GTKWave Analyzer v3.3.111 (w)1999-2020 BSI
[*] Sat May 13 08:57:35 2023
[*] Tue May 16 11:05:44 2023
[*]
[dumpfile] "/home/user/9086/system/boot_code.fst"
[dumpfile_mtime] "Sat May 13 08:57:31 2023"
[dumpfile_size] 13788
[dumpfile_mtime] "Tue May 16 11:04:39 2023"
[dumpfile_size] 7259
[savefile] "/home/user/9086/gtkwave_savefile.gtkw"
[timestart] 87160000000
[size] 1140 993
[timestart] 33090000000
[size] 1428 1003
[pos] -1 -1
*-31.895050 93500000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
*-32.795048 62150000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[treeopen] TOP.
[treeopen] TOP.system.
[treeopen] TOP.system.p.
@ -19,41 +19,45 @@
[sst_width] 263
[signals_width] 231
[sst_expanded] 1
[sst_vpaned_height] 296
@29
[sst_vpaned_height] 298
@28
TOP.system.clock
TOP.system.reset
@23
@22
TOP.system.address_bus[19:0]
TOP.system.data_bus[15:0]
@29
@28
TOP.system.p.read
TOP.system.p.write
@201
@200
-
@29
@28
TOP.system.p.BIU.VALID_INSTRUCTION
@29
TOP.system.p.valid_instruction_ack
@28
TOP.system.p.valid_exec_data
@23
@22
TOP.system.p.execute_unit.INSTRUCTION_BUFFER[23:0]
TOP.system.p.BIU.biu_state[3:0]
@29
@28
TOP.system.p.execute_unit.exec_state[3:0]
TOP.system.p.proc_state[2:0]
TOP.system.p.execute_unit.work
TOP.system.p.BIU.write_request
TOP.system.p.BIU.read_request
TOP.system.p.SIMPLE_MICRO
@23
@22
TOP.system.p.ucode_seq_addr[4:0]
@29
@28
TOP.system.p.execute_unit.biu_jump_req
@201
@200
-
@29
@28
TOP.system.p.ERROR[2:0]
TOP.system.IOMEM
TOP.system.p.HALT
@23
@22
TOP.system.p.BIU.INSTRUCTION[31:0]
TOP.system.p.decoder.seq_addr_entry[4:0]
TOP.system.p.BIU.FIFO_end[3:0]

View File

@ -42,7 +42,7 @@ module BIU (
/* */ inout [15:0] external_data_bus,output reg read, output reg write,output reg BHE,output reg IOMEM,
/* Internal */ output reg [31:0] INSTRUCTION, output reg VALID_INSTRUCTION, output reg [15:0] INSTRUCTION_LOCATION, input jump_req,
/* */ input[15:0] ADDRESS_INPUT, inout [15:0] DATA, input write_request, input read_request, input Wbit, output reg VALID_DATA, input MEM_OR_IO,
/* */ input [`PROC_STATE_BITS-1:0] proc_state, input SIMPLE_MICRO
/* */ input valid_instruction_ack
`ifdef OTUPUT_JSON_STATISTICS
/* Statistics */ ,output wire [`L1_CACHE_SIZE-1:0] FIFO_SIZE_STAT, output wire VALID_INSTRUCTION_STAT
`endif
@ -278,7 +278,6 @@ always @(posedge clock) begin
VALID_INSTRUCTION <= 0;
VALID_DATA <= 0;
DATA_DIR <= 0;
was_dec <= 0;
end
default: begin
biu_state <= `BIU_NEXT_ACTION;/*Should be unreachable*/
@ -297,37 +296,12 @@ InstrSize fifoInstrSize({INPUT_FIFO[FIFO_start][7:0],INPUT_FIFO[FIFO_start+4'd1]
Is1 Is1(INPUT_FIFO[FIFO_start][7:0],Isit1);
`endif
reg was_dec;
reg was_simple;
always @( proc_state ) begin
case (proc_state)
`PROC_DE_STATE_ENTRY: begin
was_dec<=1;
end
default: begin
if( SIMPLE_MICRO==0 && was_dec==1 )begin
was_dec<=0;
/* verilator lint_off BLKSEQ */
FIFO_start = FIFO_start + {1'b0,Isize};
/* verilator lint_on BLKSEQ */
INSTRUCTION_LOCATION <= INSTRUCTION_LOCATION + {12'b0,Isize};;
VALID_INSTRUCTION <= 0;
end else if ( SIMPLE_MICRO==1 && was_simple == 1) begin
was_simple<=0;
was_dec<=0;
/* verilator lint_off BLKSEQ */
FIFO_start = FIFO_start + {1'b0,Isize};
/* verilator lint_on BLKSEQ */
INSTRUCTION_LOCATION <= INSTRUCTION_LOCATION + {12'b0,Isize};;
VALID_INSTRUCTION <= 0;
end
end
endcase
end
always @( negedge SIMPLE_MICRO ) begin
was_simple <= 1;
always @( valid_instruction_ack ) begin
/* verilator lint_off BLKSEQ */
FIFO_start = FIFO_start + {1'b0,Isize};
/* verilator lint_on BLKSEQ */
INSTRUCTION_LOCATION <= INSTRUCTION_LOCATION + {12'b0,Isize};;
VALID_INSTRUCTION <= 0;
end
always @( posedge jump_req ) begin

View File

@ -45,3 +45,5 @@
`define EXEC_NEXT_MICROCODE 4'b1010
`define EXEC_RESET 4'b1011
`define EXEC_JUMP_RELEASE 4'b1101

View File

@ -108,7 +108,6 @@ always @(posedge clock) begin
end
`EXEC_DONE:begin
reg_write_we <= 1;
biu_jump_req <= 0;
use_exec_reg_addr <= 0;
if(valid_input)begin
exec_state <= init_state;
@ -311,8 +310,8 @@ always @(posedge clock) begin
3'b101:begin /* Program Counter*/
BIU_ADDRESS_INPUT <= ALU_O[15:0];
biu_jump_req <= 1;
exec_state <= `EXEC_DONE;
work <= 0;
exec_state <= `EXEC_JUMP_RELEASE;
work <= 1;
end
3'b110:begin /* SP Indirect write*/
reg_read_port1_addr <= 4'b1100;
@ -331,6 +330,11 @@ always @(posedge clock) begin
end
endcase
end
`EXEC_JUMP_RELEASE:begin
biu_jump_req <= 0;
exec_state <= `EXEC_DONE;
work <= 0;
end
`EXEC_MEMIO_WRITE:begin
/* if memio_address_select == 0 ADDRESS: reg_read_port1_data DATA:ALU1_O */
/* if memio_address_select == 1 ADDRESS: ALU1_O DATA: reg_read_port1_data */

View File

@ -50,7 +50,7 @@ module processor (
/* If there is an error either from the decoder or execution unit set it to ERROR */
assign ERROR=(DE_ERROR!=`ERR_NO_ERROR)?DE_ERROR:(EXEC_ERROR!=`ERR_NO_ERROR)?EXEC_ERROR:`ERR_NO_ERROR;
reg [`PROC_STATE_BITS-1:0] state;
reg [`PROC_STATE_BITS-1:0] proc_state;
/*############ Execution Unit ################################################### */
@ -101,13 +101,14 @@ wire [15:0] BIU_DATA;
wire [31:0] INSTRUCTION;
wire biu_write_request, biu_read_request, BIU_VALID_DATA;
wire biu_jump_req, biu_data_direction,VALID_INSTRUCTION;
reg valid_instruction_ack;
BIU BIU(
/* Outside world */ clock,reset,external_address_bus
/* */ ,external_data_bus,read,write,BHE,IOMEM
/* Internal */ ,INSTRUCTION,VALID_INSTRUCTION,INSTRUCTION_LOCATION,biu_jump_req
/* */ ,BIU_ADDRESS_INPUT,BIU_DATA,biu_write_request,biu_read_request,Wbit,BIU_VALID_DATA,MEM_OR_IO
/* */ ,state,SIMPLE_MICRO
/* */ ,valid_instruction_ack
`ifdef OTUPUT_JSON_STATISTICS
/* Statistics */ ,L1_SIZE_STAT, VALID_INSTRUCTION_STAT
`endif
@ -187,13 +188,13 @@ register_file register_file(
/*** RESET LOGIC ***/
always @(negedge reset) begin
state <= `PROC_HALT; //TODO: race condition ??
proc_state <= `PROC_HALT; //TODO: race condition ??
`ifdef CALCULATE_IPC
new_instruction<=0;
`endif
end
always @(posedge reset) begin
state <= `PROC_RESET;
proc_state <= `PROC_RESET;
end
/*** Processor stages ***/
@ -206,13 +207,14 @@ reg [23:0] INSTRUCTION_BUFFER;
reg owe_set_init;
always @(posedge clock) begin
case(state)
case(proc_state)
`PROC_RESET:begin
ucode_seq_addr <= `UCODE_NO_INSTRUCTION;
DE_OUTPUT_sampled <= 0;
SIMPLE_MICRO <= 0;
state <= `PROC_DE_STATE_ENTRY;
owe_set_init<=0;
proc_state <= `PROC_DE_STATE_ENTRY;
owe_set_init <= 0;
valid_instruction_ack <= 0;
end
`PROC_DE_STATE_ENTRY:begin
if(VALID_INSTRUCTION==1 || SIMPLE_MICRO == 1 ) begin
@ -220,6 +222,7 @@ always @(posedge clock) begin
DE_OUTPUT_sampled <= DE_OUTPUT;
if(SIMPLE_MICRO==0||owe_set_init==1)begin
valid_instruction_ack <= !valid_instruction_ack;
owe_set_init<=0;
set_initial_values<=0;
@ -236,10 +239,10 @@ always @(posedge clock) begin
/*switch to microcode decoding*/
ucode_seq_addr <= ucode_seq_addr_entry;
SIMPLE_MICRO <= 1;
/*keep state the same and rerun decode this time with all the data from the microcode rom*/
/*keep proc_state the same and rerun decode this time with all the data from the microcode rom*/
end else begin
valid_exec_data <= 1;
state <= `PROC_WAIT;
proc_state <= `PROC_WAIT;
end
end else begin
if( DE_DEPENDS_ON_PREVIOUS == 0)
@ -248,7 +251,7 @@ always @(posedge clock) begin
ucode_seq_addr <= ucode_seq_addr_entry;
SIMPLE_MICRO <= 1;
owe_set_init <= 1;
/*keep state the same and rerun decode this time with all the data from the microcode rom*/
/*keep proc_state the same and rerun decode this time with all the data from the microcode rom*/
end
end
end
@ -256,7 +259,7 @@ always @(posedge clock) begin
`PROC_WAIT:begin
set_initial_values<=1;
valid_exec_data<=0;
state <= `PROC_DE_STATE_ENTRY;
proc_state <= `PROC_DE_STATE_ENTRY;
if( SIMPLE_MICRO == 1 ) begin
ucode_seq_addr <= ucode_seq_addr_entry; /*Reused for next address*/
if( ucode_seq_addr_entry == `UCODE_NO_INSTRUCTION )begin