Add mock D$ implementation

This commit is contained in:
Florian Zaruba 2017-05-30 10:46:46 +02:00
parent 7d0ca57a9e
commit a60ca39621
2 changed files with 121 additions and 86 deletions

View file

@ -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;

View file

@ -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