`include "define.v" module tb; //--------------------------------------------------------------------------- //clock & reset gnerator //--------------------------------------------------------------------------- localparam PERIOD = 10; localparam HALF_PERIOD = PERIOD>>1; reg rst = 1'b1; reg clk = 1'b0; initial begin #(10*PERIOD) rst = 1'b0; end always begin clk = #(HALF_PERIOD) ~clk; end //--------------------------------------------------------------------------- //dut //--------------------------------------------------------------------------- localparam IMEM_LEN = `INUM; wire imem_req; wire `N(`XLEN) imem_addr; wire `N(IMEM_LEN*`XLEN) imem_rdata; wire imem_resp; wire imem_err; wire dmem_req; wire dmem_cmd; wire `N(2) dmem_width; wire `N(`XLEN) dmem_addr; wire `N(`XLEN) dmem_wdata; wire `N(`XLEN) dmem_rdata; wire dmem_resp; wire dmem_err; rv3n_top dut( .clk ( clk ), .rst ( rst ), // instruction memory interface .imem_req ( imem_req ), .imem_addr ( imem_addr ), .imem_rdata ( imem_rdata ), .imem_resp ( imem_resp ), .imem_err ( imem_err ), // Data memory interface .dmem_req ( dmem_req ), .dmem_cmd ( dmem_cmd ), .dmem_width ( dmem_width ), .dmem_addr ( dmem_addr ), .dmem_wdata ( dmem_wdata ), .dmem_rdata ( dmem_rdata ), .dmem_resp ( dmem_resp ), .dmem_err ( dmem_err ) ); //--------------------------------------------------------------------------- //imem memory //--------------------------------------------------------------------------- localparam [3:0] IMEM_STALL_DEFINITION = 4'h0; localparam MEMSIZE = (1<<16)-1; reg `N(8) memory `N(MEMSIZE); //imem reading reg `N(16) imem_starting_addr; `FFx(imem_starting_addr,0) imem_starting_addr <= imem_req ? imem_addr : imem_starting_addr; reg `N(IMEM_LEN*`XLEN) imem_outcome; always @(*) begin:comb_imem_outcome integer i; imem_outcome = 0; for (i=0;i<(IMEM_LEN*4);i=i+1) imem_outcome[`IDX(i,8)] = memory[imem_starting_addr+i]; end assign imem_rdata = imem_outcome; reg [3:0] imem_stall_time; always @ ( posedge clk or posedge rst ) begin if ( rst ) imem_stall_time <= IMEM_STALL_DEFINITION; else if ( imem_req ) imem_stall_time <= ( IMEM_STALL_DEFINITION==4'hF ) ? $random : IMEM_STALL_DEFINITION; else; end reg [3:0] imem_stall_count; always @ ( posedge clk or posedge rst ) begin if ( rst ) imem_stall_count <= IMEM_STALL_DEFINITION; else if ( imem_req ) imem_stall_count <= 0; else if ( imem_stall_count