mirror of
https://github.com/openhwgroup/cva6.git
synced 2025-04-20 12:17:19 -04:00
Add mock D$ implementation
This commit is contained in:
parent
7d0ca57a9e
commit
a60ca39621
2 changed files with 121 additions and 86 deletions
|
@ -18,7 +18,7 @@
|
|||
//
|
||||
|
||||
module core_mem (
|
||||
input logic clk_i, // Clock
|
||||
input logic clk_i, // Clock
|
||||
input logic rst_ni, // Asynchronous reset active low
|
||||
|
||||
// Instruction memory/cache
|
||||
|
@ -29,12 +29,14 @@ module core_mem (
|
|||
output logic instr_if_data_rvalid_o,
|
||||
output logic [31:0] instr_if_data_rdata_o,
|
||||
// Data memory/cache
|
||||
input logic [63:0] data_if_address_i,
|
||||
input logic [11:0] data_if_address_index_i,
|
||||
input logic [43:0] data_if_address_tag_i,
|
||||
input logic [63:0] data_if_data_wdata_i,
|
||||
input logic data_if_data_req_i,
|
||||
input logic data_if_data_we_i,
|
||||
input logic [7:0] data_if_data_be_i,
|
||||
input logic [1:0] data_if_tag_status_i,
|
||||
input logic data_if_kill_req_i,
|
||||
input logic data_if_tag_valid_i,
|
||||
output logic data_if_data_gnt_o,
|
||||
output logic data_if_data_rvalid_o,
|
||||
output logic [63:0] data_if_data_rdata_o
|
||||
|
@ -43,36 +45,66 @@ module core_mem (
|
|||
localparam ADDRESS_WIDTH = 11;
|
||||
|
||||
logic [ADDRESS_WIDTH-1:0] instr_address;
|
||||
logic [ADDRESS_WIDTH-1:0] data_address;
|
||||
logic [2:0] instr_address_offset_q;
|
||||
logic [63:0] instr_data;
|
||||
// D$ Mock
|
||||
logic req, we;
|
||||
logic [7:0] be;
|
||||
logic [11:0] index;
|
||||
logic [63:0] wdata;
|
||||
logic [55:0] data_address;
|
||||
assign data_address = {data_if_address_tag_i, index[11:3]};
|
||||
|
||||
|
||||
// we always grant the request
|
||||
assign instr_if_data_gnt_o = instr_if_data_req_i;
|
||||
assign instr_address = instr_if_address_i[ADDRESS_WIDTH-1+3:3];
|
||||
// this is necessary as the interface to the dual port memory is 64 bit, but the fetch interface of the core is 32 bit
|
||||
assign instr_if_data_rdata_o = (instr_address_offset_q[2]) ? instr_data[63:32] : instr_data[31:0];
|
||||
|
||||
dp_ram #(
|
||||
.ADDR_WIDTH ( ADDRESS_WIDTH ),
|
||||
.DATA_WIDTH ( 64 )
|
||||
.ADDR_WIDTH ( ADDRESS_WIDTH ),
|
||||
.DATA_WIDTH ( 64 )
|
||||
) ram_i (
|
||||
.clk ( clk_i ),
|
||||
.en_a_i ( 1'b1 ),
|
||||
.addr_a_i ( instr_address ),
|
||||
.wdata_a_i ( ), // not connected
|
||||
.rdata_a_o ( instr_data ),
|
||||
.we_a_i ( 1'b0 ), // r/o interface
|
||||
.be_a_i ( ),
|
||||
.clk ( clk_i ),
|
||||
.en_a_i ( 1'b1 ),
|
||||
.addr_a_i ( instr_address ),
|
||||
.wdata_a_i ( ), // not connected
|
||||
.rdata_a_o ( instr_data ),
|
||||
.we_a_i ( 1'b0 ), // r/o interface
|
||||
.be_a_i ( ),
|
||||
// data RAM
|
||||
.en_b_i ( ),
|
||||
.addr_b_i ( ),
|
||||
.wdata_b_i ( ),
|
||||
.rdata_b_o ( ),
|
||||
.we_b_i ( data_if_data_we_i ),
|
||||
.be_b_i ( data_if_data_be_i )
|
||||
.en_b_i ( req ),
|
||||
.addr_b_i ( data_address[ADDRESS_WIDTH-1:0] ),
|
||||
.wdata_b_i ( wdata ),
|
||||
.rdata_b_o ( data_if_data_rdata_o),
|
||||
.we_b_i ( we ),
|
||||
.be_b_i ( be )
|
||||
);
|
||||
|
||||
// ----------------------
|
||||
// DCache Mock Interface
|
||||
// ----------------------
|
||||
// give the grant immediately
|
||||
assign data_if_data_gnt_o = data_if_data_req_i;
|
||||
assign data_if_data_rvalid_o = req;
|
||||
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin
|
||||
if(~rst_ni) begin
|
||||
req <= '0;
|
||||
be <= '0;
|
||||
we <= '0;
|
||||
index <= '0;
|
||||
wdata <= '0;
|
||||
end else begin
|
||||
req <= data_if_data_req_i;
|
||||
be <= data_if_data_be_i;
|
||||
we <= data_if_data_we_i;
|
||||
index <= data_if_address_index_i;
|
||||
wdata <= data_if_data_wdata_i;
|
||||
end
|
||||
end
|
||||
|
||||
// Output the rvalid one cycle later, together with the rdata
|
||||
always_ff @(posedge clk_i or negedge rst_ni) begin : proc_
|
||||
if(~rst_ni) begin
|
||||
instr_if_data_rvalid_o <= 1'b0;
|
||||
|
|
135
tb/core_tb.sv
135
tb/core_tb.sv
|
@ -16,11 +16,9 @@ module core_tb;
|
|||
logic clk_i;
|
||||
logic rst_ni;
|
||||
|
||||
mem_if instr_if(clk_i);
|
||||
mem_if data_if(clk_i);
|
||||
debug_if debug_if();
|
||||
core_if core_if(clk_i);
|
||||
|
||||
core_if core_if (clk_i);
|
||||
mem_if instr_if (clk_i);
|
||||
|
||||
logic [63:0] instr_if_address;
|
||||
logic instr_if_data_req;
|
||||
|
@ -29,83 +27,88 @@ module core_tb;
|
|||
logic instr_if_data_rvalid;
|
||||
logic [31:0] instr_if_data_rdata;
|
||||
|
||||
logic [63:0] data_if_address_i;
|
||||
logic [11:0] data_if_address_index_i;
|
||||
logic [43:0] data_if_address_tag_i;
|
||||
logic [63:0] data_if_data_wdata_i;
|
||||
logic data_if_data_req_i;
|
||||
logic data_if_data_we_i;
|
||||
logic [7:0] data_if_data_be_i;
|
||||
logic [1:0] data_if_tag_status_i;
|
||||
logic data_if_kill_req_i;
|
||||
logic data_if_tag_valid_i;
|
||||
logic data_if_data_gnt_o;
|
||||
logic data_if_data_rvalid_o;
|
||||
logic [63:0] data_if_data_rdata_o;
|
||||
|
||||
core_mem core_mem_i (
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.instr_if_address_i ( instr_if_address ),
|
||||
.instr_if_data_req_i ( instr_if_data_req ),
|
||||
.instr_if_data_be_i ( instr_if_data_be ),
|
||||
.instr_if_data_gnt_o ( instr_if_data_gnt ),
|
||||
.instr_if_data_rvalid_o ( instr_if_data_rvalid ),
|
||||
.instr_if_data_rdata_o ( instr_if_data_rdata ),
|
||||
.data_if_address_i ( data_if_address_i ),
|
||||
.data_if_data_wdata_i ( data_if_data_wdata_i ),
|
||||
.data_if_data_req_i ( data_if_data_req_i ),
|
||||
.data_if_data_we_i ( data_if_data_we_i ),
|
||||
.data_if_data_be_i ( data_if_data_be_i ),
|
||||
.data_if_tag_status_i ( data_if_tag_status_i ),
|
||||
.data_if_data_gnt_o ( data_if_data_gnt_o ),
|
||||
.data_if_data_rvalid_o ( data_if_data_rvalid_o ),
|
||||
.data_if_data_rdata_o ( data_if_data_rdata_o )
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.instr_if_address_i ( instr_if_address ),
|
||||
.instr_if_data_req_i ( instr_if_data_req ),
|
||||
.instr_if_data_be_i ( instr_if_data_be ),
|
||||
.instr_if_data_gnt_o ( instr_if_data_gnt ),
|
||||
.instr_if_data_rvalid_o ( instr_if_data_rvalid ),
|
||||
.instr_if_data_rdata_o ( instr_if_data_rdata ),
|
||||
|
||||
.data_if_address_index_i ( data_if_address_index_i ),
|
||||
.data_if_address_tag_i ( data_if_address_tag_i ),
|
||||
.data_if_data_wdata_i ( data_if_data_wdata_i ),
|
||||
.data_if_data_req_i ( data_if_data_req_i ),
|
||||
.data_if_data_we_i ( data_if_data_we_i ),
|
||||
.data_if_data_be_i ( data_if_data_be_i ),
|
||||
.data_if_kill_req_i ( data_if_kill_req_i ),
|
||||
.data_if_tag_valid_i ( data_if_tag_valid_i ),
|
||||
.data_if_data_gnt_o ( data_if_data_gnt_o ),
|
||||
.data_if_data_rvalid_o ( data_if_data_rvalid_o ),
|
||||
.data_if_data_rdata_o ( data_if_data_rdata_o )
|
||||
);
|
||||
|
||||
ariane dut (
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.clock_en_i ( core_if.clock_en ),
|
||||
.test_en_i ( core_if.test_en ),
|
||||
.fetch_enable_i ( core_if.fetch_enable ),
|
||||
.core_busy_o ( core_if.core_busy ),
|
||||
.ext_perf_counters_i ( ),
|
||||
.boot_addr_i ( core_if.boot_addr ),
|
||||
.core_id_i ( core_if.core_id ),
|
||||
.cluster_id_i ( core_if.cluster_id ),
|
||||
.clk_i ( clk_i ),
|
||||
.rst_ni ( rst_ni ),
|
||||
.clock_en_i ( core_if.clock_en ),
|
||||
.test_en_i ( core_if.test_en ),
|
||||
.fetch_enable_i ( core_if.fetch_enable ),
|
||||
.core_busy_o ( core_if.core_busy ),
|
||||
.ext_perf_counters_i ( ),
|
||||
.boot_addr_i ( core_if.boot_addr ),
|
||||
.core_id_i ( core_if.core_id ),
|
||||
.cluster_id_i ( core_if.cluster_id ),
|
||||
|
||||
.instr_if_address_o ( instr_if_address ),
|
||||
.instr_if_data_req_o ( instr_if_data_req ),
|
||||
.instr_if_data_be_o ( instr_if_data_be ),
|
||||
.instr_if_data_gnt_i ( instr_if_data_gnt ),
|
||||
.instr_if_data_rvalid_i ( instr_if_data_rvalid ),
|
||||
.instr_if_data_rdata_i ( instr_if_data_rdata ),
|
||||
.instr_if_address_o ( instr_if_address ),
|
||||
.instr_if_data_req_o ( instr_if_data_req ),
|
||||
.instr_if_data_be_o ( instr_if_data_be ),
|
||||
.instr_if_data_gnt_i ( instr_if_data_gnt ),
|
||||
.instr_if_data_rvalid_i ( instr_if_data_rvalid ),
|
||||
.instr_if_data_rdata_i ( instr_if_data_rdata ),
|
||||
|
||||
.data_if_address_index_o ( ),
|
||||
.data_if_address_tag_o ( ),
|
||||
.data_if_data_wdata_o ( data_if.data_wdata ),
|
||||
.data_if_data_req_o ( data_if.data_req ),
|
||||
.data_if_data_we_o ( data_if.data_we ),
|
||||
.data_if_data_be_o ( data_if.data_be ),
|
||||
.data_if_kill_req_o ( ),
|
||||
.data_if_tag_valid_o ( ),
|
||||
.data_if_data_gnt_i ( data_if.data_gnt ),
|
||||
.data_if_data_rvalid_i ( data_if.data_rvalid ),
|
||||
.data_if_data_rdata_i ( data_if.data_rdata ),
|
||||
.data_if_address_index_o ( data_if_address_index_i ),
|
||||
.data_if_address_tag_o ( data_if_address_tag_i ),
|
||||
.data_if_data_wdata_o ( data_if_data_wdata_i ),
|
||||
.data_if_data_req_o ( data_if_data_req_i ),
|
||||
.data_if_data_we_o ( data_if_data_we_i ),
|
||||
.data_if_data_be_o ( data_if_data_be_i ),
|
||||
.data_if_kill_req_o ( data_if_kill_req_i ),
|
||||
.data_if_tag_valid_o ( data_if_tag_valid_i ),
|
||||
.data_if_data_gnt_i ( data_if_data_gnt_o ),
|
||||
.data_if_data_rvalid_i ( data_if_data_rvalid_o ),
|
||||
.data_if_data_rdata_i ( data_if_data_rdata_o ),
|
||||
|
||||
.irq_i ( core_if.irq ),
|
||||
.irq_id_i ( core_if.irq_id ),
|
||||
.irq_ack_o ( core_if.irq_ack ),
|
||||
.irq_sec_i ( core_if.irq_sec ),
|
||||
.sec_lvl_o ( core_if.sec_lvl ),
|
||||
.irq_i ( core_if.irq ),
|
||||
.irq_id_i ( core_if.irq_id ),
|
||||
.irq_ack_o ( core_if.irq_ack ),
|
||||
.irq_sec_i ( core_if.irq_sec ),
|
||||
.sec_lvl_o ( core_if.sec_lvl ),
|
||||
|
||||
.debug_req_i ( ),
|
||||
.debug_gnt_o ( ),
|
||||
.debug_rvalid_o ( ),
|
||||
.debug_addr_i ( ),
|
||||
.debug_we_i ( ),
|
||||
.debug_wdata_i ( ),
|
||||
.debug_rdata_o ( ),
|
||||
.debug_halted_o ( ),
|
||||
.debug_halt_i ( ),
|
||||
.debug_resume_i ( )
|
||||
.debug_req_i ( ),
|
||||
.debug_gnt_o ( ),
|
||||
.debug_rvalid_o ( ),
|
||||
.debug_addr_i ( ),
|
||||
.debug_we_i ( ),
|
||||
.debug_wdata_i ( ),
|
||||
.debug_rdata_o ( ),
|
||||
.debug_halted_o ( ),
|
||||
.debug_halt_i ( ),
|
||||
.debug_resume_i ( )
|
||||
);
|
||||
|
||||
// clock process
|
||||
|
@ -138,7 +141,7 @@ module core_tb;
|
|||
uvm_config_db #(virtual core_if)::set(null, "uvm_test_top", "core_if", core_if);
|
||||
uvm_config_db #(virtual mem_if )::set(null, "uvm_test_top", "instr_mem_if", instr_if);
|
||||
// print the topology
|
||||
uvm_top.enable_print_topology = 1;
|
||||
// uvm_top.enable_print_topology = 1;
|
||||
// Start UVM test
|
||||
run_test();
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue