mirror of
https://github.com/openhwgroup/cva5.git
synced 2025-04-22 13:07:33 -04:00
Remove broken legacy tests
This commit is contained in:
parent
f5a5ee7406
commit
a0f6e3cc54
9 changed files with 0 additions and 2452 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1 @@
|
|||
test_benches/verilator/build
|
||||
|
||||
|
|
|
@ -1,212 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2017 Eric Matthews, Lesley Shannon
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Initial code developed under the supervision of Dr. Lesley Shannon,
|
||||
* Reconfigurable Computing Lab, Simon Fraser University.
|
||||
*
|
||||
* Author(s):
|
||||
* Eric Matthews <ematthew@sfu.ca>
|
||||
*/
|
||||
|
||||
//No error checking for incorrect ordering of axi control signals from Master side of interface
|
||||
import tb_tools::*;
|
||||
import cva5_config::*;
|
||||
|
||||
module axi_mem_sim
|
||||
#(parameter string file_name = "")
|
||||
(
|
||||
input logic clk,
|
||||
input logic rst,
|
||||
axi_interface.slave axi,
|
||||
|
||||
input logic[31:0] if_pc,
|
||||
input logic[31:0] dec_pc
|
||||
);
|
||||
|
||||
typedef struct packed{
|
||||
logic [31:0] araddr;
|
||||
logic [7:0] arlen;
|
||||
logic [2:0] arsize;
|
||||
logic [1:0] arburst;
|
||||
logic [3:0] arcache;
|
||||
logic [5:0] arid;
|
||||
} read_request;
|
||||
|
||||
typedef struct packed{
|
||||
logic [31:0] awaddr;
|
||||
logic [7:0] awlen;
|
||||
logic [2:0] awsize;
|
||||
logic [1:0] awburst;
|
||||
logic [3:0] awcache;
|
||||
logic [5:0] awid;
|
||||
} write_request;
|
||||
|
||||
const int READ_QUEUE_DEPTH = 8;
|
||||
const int WRITE_QUEUE_DEPTH = 4;
|
||||
const int WRITE_DATA_QUEUE_DEPTH = 128;
|
||||
|
||||
integer write_queue_size;
|
||||
integer read_data_queue_size;
|
||||
logic[47:0] write_request_count;
|
||||
logic[47:0] read_request_count;
|
||||
|
||||
int read_burst_count;
|
||||
int processing_read_request;
|
||||
int processing_write_request;
|
||||
|
||||
read_request read_queue[$];
|
||||
write_request write_queue[$];
|
||||
logic [31:0] write_data_queue[$];
|
||||
logic [31:0] read_data_queue[$];
|
||||
|
||||
sim_mem ddr = new();
|
||||
|
||||
//For opcode inspection
|
||||
string dec_opcode;
|
||||
string if_opcode;
|
||||
logic[0:64*8-1] if_inst_text;
|
||||
logic[0:64*8-1] dec_inst_text;
|
||||
/////////////////////
|
||||
|
||||
function void getReadData (bit[31:0] addr, bit[7:0] len);
|
||||
for (int i = 0; i <= len; i=i+1) begin
|
||||
read_data_queue.push_back(ddr.readw(addr[31:2]+i));
|
||||
end
|
||||
endfunction
|
||||
|
||||
//Simulation opcode support
|
||||
assign if_opcode = ddr.readopcode(if_pc[31:2]);
|
||||
assign dec_opcode = ddr.readopcode(dec_pc[31:2]);
|
||||
|
||||
genvar i;
|
||||
generate
|
||||
for(i=0; i<64; i=i+1) begin
|
||||
always_comb begin
|
||||
if_inst_text[8*i: 8*(i+1) -1]=if_opcode[i];
|
||||
dec_inst_text[8*i: 8*(i+1) -1]=dec_opcode[i];
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
///////////////////
|
||||
|
||||
|
||||
initial begin
|
||||
ddr.load_program(file_name, RESET_VEC);
|
||||
end
|
||||
|
||||
//arready response
|
||||
assign axi.arready = read_queue.size() < READ_QUEUE_DEPTH;
|
||||
|
||||
//Read request processing
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
read_request_count <= 0;
|
||||
end
|
||||
else if(axi.arvalid & axi.arready) begin
|
||||
read_queue.push_back(
|
||||
{axi.araddr, axi.arlen, axi.arsize, axi.arburst, axi.arcache, axi.arid}
|
||||
);
|
||||
getReadData(axi.araddr, axi.arlen);
|
||||
read_request_count <=read_request_count+1;
|
||||
end
|
||||
end
|
||||
|
||||
//Write request processing
|
||||
always_ff @(posedge clk) begin
|
||||
if(axi.awvalid & axi.awready) begin
|
||||
write_queue.push_back(
|
||||
{axi.awaddr, axi.awlen, axi.awsize, axi.awburst, axi.awcache, axi.awid}
|
||||
);
|
||||
end
|
||||
write_queue_size <= write_queue.size();
|
||||
end
|
||||
assign axi.awready = write_queue.size() < WRITE_QUEUE_DEPTH;
|
||||
|
||||
assign axi.wready = write_data_queue.size() < WRITE_DATA_QUEUE_DEPTH;
|
||||
|
||||
//bresp
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
axi.bvalid <= 0;
|
||||
end
|
||||
else if(axi.wvalid & axi.wlast) begin
|
||||
axi.bresp <= 0;
|
||||
axi.bvalid <=1;
|
||||
axi.bid <= write_queue[0].awid;
|
||||
write_queue.pop_front();
|
||||
end
|
||||
else if (axi.bready) begin
|
||||
axi.bvalid <=0;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
write_request_count <= 0;
|
||||
end
|
||||
else if(axi.wvalid) begin
|
||||
write_request_count <= write_request_count + 1;
|
||||
end
|
||||
end
|
||||
|
||||
//Handle write data
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
end
|
||||
else if(axi.wvalid) begin
|
||||
ddr.writew(write_queue.size > 0 ? write_queue[0].awaddr[31:2] : axi.awaddr[31:2], axi.wdata, axi.wstrb);
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
read_data_queue_size <= read_data_queue.size();
|
||||
end
|
||||
|
||||
//Return data
|
||||
always_ff @(posedge clk) begin
|
||||
if(rst) begin
|
||||
axi.rvalid <= 0;
|
||||
axi.rlast <= 0;
|
||||
read_burst_count <= 0;
|
||||
end
|
||||
else if(read_queue.size > 0) begin
|
||||
if(axi.rready) begin
|
||||
axi.rdata <= read_data_queue.pop_front();
|
||||
axi.rvalid <= 1;
|
||||
axi.rid <= read_queue[0].arid;
|
||||
if( read_queue[0].arlen == read_burst_count) begin
|
||||
axi.rlast <= 1;
|
||||
read_queue.pop_front();
|
||||
read_burst_count <= 0;
|
||||
end
|
||||
else begin
|
||||
read_burst_count <= read_burst_count + 1;
|
||||
axi.rlast <= 0;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
axi.rvalid <= 0;
|
||||
axi.rlast <= 0;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
axi.rvalid <= 0;
|
||||
axi.rlast <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
|
@ -1,341 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2017 Eric Matthews, Lesley Shannon
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Initial code developed under the supervision of Dr. Lesley Shannon,
|
||||
* Reconfigurable Computing Lab, Simon Fraser University.
|
||||
*
|
||||
* Author(s):
|
||||
* Eric Matthews <ematthew@sfu.ca>
|
||||
*/
|
||||
|
||||
`timescale 1ns/1ns
|
||||
|
||||
`define MEMORY_FILE "/home/ematthew/Research/RISCV/software/riscv-tools/riscv-tests/benchmarks/dhrystone.riscv.sim_init"
|
||||
`define UART_LOG "/home/ematthew/uart.log"
|
||||
|
||||
module cva5_tb
|
||||
|
||||
import tb_tools::*;
|
||||
import cva5_config::*;
|
||||
import l2_config_and_types::*;
|
||||
import riscv_types::*;
|
||||
import cva5_types::*;
|
||||
|
||||
( );
|
||||
|
||||
logic simulator_clk;
|
||||
logic simulator_resetn;
|
||||
|
||||
//axi block diagram inputs
|
||||
logic axi_clk;
|
||||
logic resetn;
|
||||
logic sin;
|
||||
|
||||
//AXI memory
|
||||
logic [31:0]axi_araddr;
|
||||
logic [1:0]axi_arburst;
|
||||
logic [3:0]axi_arcache;
|
||||
logic [5:0]axi_arid;
|
||||
logic [7:0]axi_arlen;
|
||||
logic [0:0]axi_arlock;
|
||||
logic [2:0]axi_arprot;
|
||||
logic [3:0]axi_arqos;
|
||||
logic axi_arready;
|
||||
logic [3:0]axi_arregion;
|
||||
logic [2:0]axi_arsize;
|
||||
logic axi_arvalid;
|
||||
logic [31:0]axi_awaddr;
|
||||
logic [1:0]axi_awburst;
|
||||
logic [3:0]axi_awcache;
|
||||
logic [5:0]axi_awid;
|
||||
logic [7:0]axi_awlen;
|
||||
logic [0:0]axi_awlock;
|
||||
logic [2:0]axi_awprot;
|
||||
logic [3:0]axi_awqos;
|
||||
logic axi_awready;
|
||||
logic [3:0]axi_awregion;
|
||||
logic [2:0]axi_awsize;
|
||||
logic axi_awvalid;
|
||||
logic [5:0]axi_bid;
|
||||
logic axi_bready;
|
||||
logic [1:0]axi_bresp;
|
||||
logic axi_bvalid;
|
||||
logic [31:0]axi_rdata;
|
||||
logic [5:0]axi_rid;
|
||||
logic axi_rlast;
|
||||
logic axi_rready;
|
||||
logic [1:0]axi_rresp;
|
||||
logic axi_rvalid;
|
||||
logic [31:0]axi_wdata;
|
||||
logic axi_wlast;
|
||||
logic axi_wready;
|
||||
logic [3:0]axi_wstrb;
|
||||
logic axi_wvalid;
|
||||
logic [5:0]axi_wid;
|
||||
|
||||
|
||||
axi_interface ddr_axi();
|
||||
|
||||
logic [31:0]mem_axi_araddr;
|
||||
logic [1:0]mem_axi_arburst;
|
||||
logic [3:0]mem_axi_arcache;
|
||||
logic [5:0]mem_axi_arid;
|
||||
logic [7:0]mem_axi_arlen;
|
||||
logic [0:0]mem_axi_arlock;
|
||||
logic [2:0]mem_axi_arprot;
|
||||
logic [3:0]mem_axi_arqos;
|
||||
logic mem_axi_arready;
|
||||
logic [3:0]mem_axi_arregion;
|
||||
logic [2:0]mem_axi_arsize;
|
||||
logic mem_axi_arvalid;
|
||||
logic [31:0]mem_axi_awaddr;
|
||||
logic [1:0]mem_axi_awburst;
|
||||
logic [3:0]mem_axi_awcache;
|
||||
logic [5:0]mem_axi_awid;
|
||||
logic [7:0]mem_axi_awlen;
|
||||
logic [0:0]mem_axi_awlock;
|
||||
logic [2:0]mem_axi_awprot;
|
||||
logic [3:0]mem_axi_awqos;
|
||||
logic mem_axi_awready;
|
||||
logic [3:0]mem_axi_awregion;
|
||||
logic [2:0]mem_axi_awsize;
|
||||
logic mem_axi_awvalid;
|
||||
logic [5:0]mem_axi_bid;
|
||||
logic mem_axi_bready;
|
||||
logic [1:0]mem_axi_bresp;
|
||||
logic mem_axi_bvalid;
|
||||
logic [31:0]mem_axi_rdata;
|
||||
logic [5:0]mem_axi_rid;
|
||||
logic mem_axi_rlast;
|
||||
logic mem_axi_rready;
|
||||
logic [1:0]mem_axi_rresp;
|
||||
logic mem_axi_rvalid;
|
||||
logic [31:0]mem_axi_wdata;
|
||||
logic mem_axi_wlast;
|
||||
logic mem_axi_wready;
|
||||
logic [3:0]mem_axi_wstrb;
|
||||
logic mem_axi_wvalid;
|
||||
logic [5:0] mem_axi_wid;
|
||||
|
||||
|
||||
//AXI bus
|
||||
logic ACLK;
|
||||
logic [12:0]bus_axi_araddr;
|
||||
logic bus_axi_arready;
|
||||
logic bus_axi_arvalid;
|
||||
logic [12:0]bus_axi_awaddr;
|
||||
logic bus_axi_awready;
|
||||
logic bus_axi_awvalid;
|
||||
logic bus_axi_bready;
|
||||
logic [1:0]bus_axi_bresp;
|
||||
logic bus_axi_bvalid;
|
||||
logic [31:0]bus_axi_rdata;
|
||||
logic bus_axi_rready;
|
||||
logic [1:0]bus_axi_rresp;
|
||||
logic bus_axi_rvalid;
|
||||
logic [31:0]bus_axi_wdata;
|
||||
logic bus_axi_wready;
|
||||
logic [3:0]bus_axi_wstrb;
|
||||
logic bus_axi_wvalid;
|
||||
|
||||
//axi block diagram outputs
|
||||
logic processor_reset;
|
||||
logic processor_clk;
|
||||
logic sout;
|
||||
|
||||
logic clk;
|
||||
logic rst;
|
||||
|
||||
|
||||
//*****************************
|
||||
|
||||
assign axi_clk = simulator_clk;
|
||||
assign resetn = simulator_resetn;
|
||||
|
||||
assign clk = simulator_clk;
|
||||
assign rst = processor_reset;
|
||||
|
||||
local_memory_interface instruction_bram();
|
||||
local_memory_interface data_bram();
|
||||
|
||||
axi_interface m_axi();
|
||||
avalon_interface m_avalon();
|
||||
wishbone_interface dwishbone();
|
||||
|
||||
l2_requester_interface l2[L2_NUM_PORTS-1:0]();
|
||||
l2_memory_interface mem();
|
||||
|
||||
|
||||
logic interrupt;
|
||||
logic timer_interrupt;
|
||||
|
||||
logic[31:0] dec_pc_debug;
|
||||
logic[31:0] if2_pc_debug;
|
||||
|
||||
integer output_file;
|
||||
|
||||
assign l2[1].request = 0;
|
||||
assign l2[1].request_push = 0;
|
||||
assign l2[1].wr_data_push = 0;
|
||||
assign l2[1].inv_ack = l2[1].inv_valid;
|
||||
assign l2[1].rd_data_ack = l2[1].rd_data_valid;
|
||||
|
||||
sim_mem simulation_mem = new();
|
||||
|
||||
|
||||
//RAM Block
|
||||
always_ff @(posedge processor_clk) begin
|
||||
if (instruction_bram.en) begin
|
||||
instruction_bram.data_out <= simulation_mem.readw(instruction_bram.addr);
|
||||
simulation_mem.writew(instruction_bram.addr,instruction_bram.data_in, instruction_bram.be);
|
||||
end
|
||||
else begin
|
||||
instruction_bram.data_out <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge processor_clk) begin
|
||||
if (data_bram.en) begin
|
||||
data_bram.data_out <= simulation_mem.readw(data_bram.addr);
|
||||
simulation_mem.writew(data_bram.addr,data_bram.data_in, data_bram.be);
|
||||
end
|
||||
else begin
|
||||
data_bram.data_out <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
cva5 uut (.*, .l2(l2[0]));
|
||||
|
||||
design_2 infra(.*);
|
||||
|
||||
l2_arbiter l2_arb (.*, .request(l2));
|
||||
|
||||
axi_to_arb l2_to_mem (.*, .l2(mem));
|
||||
|
||||
axi_mem_sim #(`MEMORY_FILE) ddr_interface (.*, .axi(ddr_axi), .if_pc(if2_pc_debug), .dec_pc(dec_pc_debug));
|
||||
|
||||
always
|
||||
#1 simulator_clk = ~simulator_clk;
|
||||
|
||||
initial begin
|
||||
simulator_clk = 0;
|
||||
interrupt = 0;
|
||||
timer_interrupt = 0;
|
||||
simulator_resetn = 0;
|
||||
|
||||
simulation_mem.load_program(`MEMORY_FILE, RESET_VEC);
|
||||
|
||||
output_file = $fopen(`UART_LOG, "w");
|
||||
if (output_file == 0) begin
|
||||
$error ("couldn't open log file");
|
||||
$finish;
|
||||
end
|
||||
do_reset();
|
||||
|
||||
#1800000;
|
||||
$fclose(output_file);
|
||||
$finish;
|
||||
end
|
||||
|
||||
task do_reset;
|
||||
begin
|
||||
simulator_resetn = 1'b0;
|
||||
#500 simulator_resetn = 1'b1;
|
||||
end
|
||||
endtask
|
||||
|
||||
|
||||
assign m_axi.arready = bus_axi_arready;
|
||||
assign bus_axi_arvalid = m_axi.arvalid;
|
||||
assign bus_axi_araddr = m_axi.araddr[12:0];
|
||||
|
||||
|
||||
//read data
|
||||
assign bus_axi_rready = m_axi.rready;
|
||||
assign m_axi.rvalid = bus_axi_rvalid;
|
||||
assign m_axi.rdata = bus_axi_rdata;
|
||||
assign m_axi.rresp = bus_axi_rresp;
|
||||
|
||||
//Write channel
|
||||
//write address
|
||||
assign m_axi.awready = bus_axi_awready;
|
||||
assign bus_axi_awaddr = m_axi.awaddr[12:0];
|
||||
assign bus_axi_awvalid = m_axi.awvalid;
|
||||
|
||||
|
||||
//write data
|
||||
assign m_axi.wready = bus_axi_wready;
|
||||
assign bus_axi_wvalid = m_axi. wvalid;
|
||||
assign bus_axi_wdata = m_axi.wdata;
|
||||
assign bus_axi_wstrb = m_axi.wstrb;
|
||||
|
||||
//write response
|
||||
assign bus_axi_bready = m_axi.bready;
|
||||
assign m_axi.bvalid = bus_axi_bvalid;
|
||||
assign m_axi.bresp = bus_axi_bresp;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
assign ddr_axi.araddr = mem_axi_araddr;
|
||||
assign ddr_axi.arburst = mem_axi_arburst;
|
||||
assign ddr_axi.arcache = mem_axi_arcache;
|
||||
assign ddr_axi.arid = mem_axi_arid;
|
||||
assign ddr_axi.arlen = mem_axi_arlen;
|
||||
assign mem_axi_arready = ddr_axi.arready;
|
||||
assign ddr_axi.arsize = mem_axi_arsize;
|
||||
assign ddr_axi.arvalid = mem_axi_arvalid;
|
||||
|
||||
assign ddr_axi.awaddr = mem_axi_awaddr;
|
||||
assign ddr_axi.awburst = mem_axi_awburst;
|
||||
assign ddr_axi.awcache = mem_axi_awcache;
|
||||
assign ddr_axi.awid = mem_axi_awid;
|
||||
assign ddr_axi.awlen = mem_axi_awlen;
|
||||
assign mem_axi_awready = ddr_axi.awready;
|
||||
assign ddr_axi.awvalid = mem_axi_awvalid;
|
||||
|
||||
assign mem_axi_bid = ddr_axi.bid;
|
||||
assign ddr_axi.bready = mem_axi_bready;
|
||||
assign mem_axi_bresp = ddr_axi.bresp;
|
||||
assign mem_axi_bvalid = ddr_axi.bvalid;
|
||||
|
||||
assign mem_axi_rdata = ddr_axi.rdata;
|
||||
assign mem_axi_rid = ddr_axi.rid;
|
||||
assign mem_axi_rlast = ddr_axi.rlast;
|
||||
assign ddr_axi.rready = mem_axi_rready;
|
||||
assign mem_axi_rresp = ddr_axi.rresp;
|
||||
assign mem_axi_rvalid = ddr_axi.rvalid;
|
||||
|
||||
assign ddr_axi.wdata = mem_axi_wdata;
|
||||
assign ddr_axi.wlast = mem_axi_wlast;
|
||||
assign mem_axi_wready = ddr_axi.wready;
|
||||
assign ddr_axi.wstrb = mem_axi_wstrb;
|
||||
assign ddr_axi.wvalid = mem_axi_wvalid;
|
||||
|
||||
|
||||
//Capture writes to UART
|
||||
always_ff @(posedge processor_clk) begin
|
||||
if (m_axi.wvalid && bus_axi_wready && m_axi.awaddr[13:0] == 4096) begin
|
||||
$fwrite(output_file, "%c",m_axi.wdata[7:0]);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
assign sin = 0;
|
||||
|
||||
endmodule
|
|
@ -1,958 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<wave_config>
|
||||
<wave_state>
|
||||
</wave_state>
|
||||
<db_ref_list>
|
||||
<db_ref path="cva5_tb_behav.wdb" id="1">
|
||||
<top_modules>
|
||||
<top_module name="glbl" />
|
||||
<top_module name="l2_config_and_types" />
|
||||
<top_module name="cva5_config" />
|
||||
<top_module name="cva5_tb" />
|
||||
<top_module name="cva5_types" />
|
||||
<top_module name="tb_tools" />
|
||||
</top_modules>
|
||||
</db_ref>
|
||||
</db_ref_list>
|
||||
<zoom_setting>
|
||||
<ZoomStartTime time="778020000fs"></ZoomStartTime>
|
||||
<ZoomEndTime time="788800001fs"></ZoomEndTime>
|
||||
<Cursor1Time time="781640000fs"></Cursor1Time>
|
||||
</zoom_setting>
|
||||
<column_width_setting>
|
||||
<NameColumnWidth column_width="297"></NameColumnWidth>
|
||||
<ValueColumnWidth column_width="112"></ValueColumnWidth>
|
||||
</column_width_setting>
|
||||
<WVObjectSize size="230" />
|
||||
<wvobject type="logic" fp_name="/cva5_tb/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/rst">
|
||||
<obj_property name="ElementShortName">rst</obj_property>
|
||||
<obj_property name="ObjectShortName">rst</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider7358" type="divider">
|
||||
<obj_property name="label">Fetch</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/branch_unit_block/branch_inputs.jal">
|
||||
<obj_property name="ElementShortName">.jal</obj_property>
|
||||
<obj_property name="ObjectShortName">.jal</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/branch_unit_block/branch_inputs.jalr">
|
||||
<obj_property name="ElementShortName">.jalr</obj_property>
|
||||
<obj_property name="ObjectShortName">.jalr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/branch_inputs.rs1">
|
||||
<obj_property name="ElementShortName">.rs1[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">.rs1[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/branch_unit_block/branch_inputs.is_call">
|
||||
<obj_property name="ElementShortName">.is_call</obj_property>
|
||||
<obj_property name="ObjectShortName">.is_call</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/branch_unit_block/branch_inputs.is_return">
|
||||
<obj_property name="ElementShortName">.is_return</obj_property>
|
||||
<obj_property name="ObjectShortName">.is_return</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/jal_imm">
|
||||
<obj_property name="ElementShortName">jal_imm[19:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">jal_imm[19:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/jalr_imm">
|
||||
<obj_property name="ElementShortName">jalr_imm[11:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">jalr_imm[11:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/br_imm">
|
||||
<obj_property name="ElementShortName">br_imm[11:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">br_imm[11:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/jump_base">
|
||||
<obj_property name="ElementShortName">jump_base[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">jump_base[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/branch_unit_block/pc_offset">
|
||||
<obj_property name="ElementShortName">pc_offset[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">pc_offset[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/bt/jump_pc">
|
||||
<obj_property name="ElementShortName">jump_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">jump_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/bt/njump_pc">
|
||||
<obj_property name="ElementShortName">njump_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">njump_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/next_pc">
|
||||
<obj_property name="ElementShortName">next_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">next_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/if_pc">
|
||||
<obj_property name="ElementShortName">if_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">if_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/bt_block/predicted_pc">
|
||||
<obj_property name="ElementShortName">predicted_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">predicted_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/bt/use_prediction">
|
||||
<obj_property name="ElementShortName">use_prediction</obj_property>
|
||||
<obj_property name="ObjectShortName">use_prediction</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/bt/use_ras">
|
||||
<obj_property name="ElementShortName">use_ras</obj_property>
|
||||
<obj_property name="ObjectShortName">use_ras</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/ras_block/ras/push">
|
||||
<obj_property name="ElementShortName">push</obj_property>
|
||||
<obj_property name="ObjectShortName">push</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/ras_block/ras/pop">
|
||||
<obj_property name="ElementShortName">pop</obj_property>
|
||||
<obj_property name="ObjectShortName">pop</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/ras_block/ras/new_addr">
|
||||
<obj_property name="ElementShortName">new_addr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">new_addr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/ras_block/ras/addr">
|
||||
<obj_property name="ElementShortName">addr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">addr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/ras_block/ras/valid">
|
||||
<obj_property name="ElementShortName">valid</obj_property>
|
||||
<obj_property name="ObjectShortName">valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/ras_block/read_index">
|
||||
<obj_property name="ElementShortName">read_index[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">read_index[2:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/ras_block/write_index">
|
||||
<obj_property name="ElementShortName">write_index[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">write_index[2:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/ddr_interface/if_inst_text">
|
||||
<obj_property name="ElementShortName">if_inst_text[0:511]</obj_property>
|
||||
<obj_property name="ObjectShortName">if_inst_text[0:511]</obj_property>
|
||||
<obj_property name="Radix">ASCIIRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/stage2_phys_address">
|
||||
<obj_property name="ElementShortName">stage2_phys_address[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">stage2_phys_address[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/inflight_count">
|
||||
<obj_property name="ElementShortName">inflight_count[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">inflight_count[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/space_in_inst_buffer">
|
||||
<obj_property name="ElementShortName">space_in_inst_buffer</obj_property>
|
||||
<obj_property name="ObjectShortName">space_in_inst_buffer</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/new_issue">
|
||||
<obj_property name="ElementShortName">new_issue</obj_property>
|
||||
<obj_property name="ObjectShortName">new_issue</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/new_mem_request">
|
||||
<obj_property name="ElementShortName">new_mem_request</obj_property>
|
||||
<obj_property name="ObjectShortName">new_mem_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/bt/flush">
|
||||
<obj_property name="ElementShortName">flush</obj_property>
|
||||
<obj_property name="ObjectShortName">flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/delayed_flush">
|
||||
<obj_property name="ElementShortName">delayed_flush</obj_property>
|
||||
<obj_property name="ObjectShortName">delayed_flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/exception">
|
||||
<obj_property name="ElementShortName">exception</obj_property>
|
||||
<obj_property name="ObjectShortName">exception</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/mem_valid">
|
||||
<obj_property name="ElementShortName">mem_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">mem_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/stage2_valid">
|
||||
<obj_property name="ElementShortName">stage2_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">stage2_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/bt/use_prediction">
|
||||
<obj_property name="ElementShortName">use_prediction</obj_property>
|
||||
<obj_property name="ObjectShortName">use_prediction</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/ib/full">
|
||||
<obj_property name="ElementShortName">full</obj_property>
|
||||
<obj_property name="ObjectShortName">full</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/ib/early_full">
|
||||
<obj_property name="ElementShortName">early_full</obj_property>
|
||||
<obj_property name="ObjectShortName">early_full</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/ib/data_in">
|
||||
<obj_property name="ElementShortName">data_in</obj_property>
|
||||
<obj_property name="ObjectShortName">data_in</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider7368" type="divider">
|
||||
<obj_property name="label">I Cache</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /stage1_addr">
|
||||
<obj_property name="ElementShortName">stage1_addr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">stage1_addr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /stage2_addr">
|
||||
<obj_property name="ElementShortName">stage2_addr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">stage2_addr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /data_out">
|
||||
<obj_property name="ElementShortName">data_out[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">data_out[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /data_valid">
|
||||
<obj_property name="ElementShortName">data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/new_issue">
|
||||
<obj_property name="ElementShortName">new_issue</obj_property>
|
||||
<obj_property name="ObjectShortName">new_issue</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /ready">
|
||||
<obj_property name="ElementShortName">ready</obj_property>
|
||||
<obj_property name="ObjectShortName">ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/\fetch_sub[1] /new_request">
|
||||
<obj_property name="ElementShortName">new_request</obj_property>
|
||||
<obj_property name="ObjectShortName">new_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/fetch_block/l1_response/data_valid">
|
||||
<obj_property name="ElementShortName">data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider254" type="divider">
|
||||
<obj_property name="label">Global Control</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/rst">
|
||||
<obj_property name="ElementShortName">rst</obj_property>
|
||||
<obj_property name="ObjectShortName">rst</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/gc_unit_block/state">
|
||||
<obj_property name="ElementShortName">state[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">state[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/gc_unit_block/next_state">
|
||||
<obj_property name="ElementShortName">next_state[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">next_state[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/gc_unit_block/clear_shift_count">
|
||||
<obj_property name="ElementShortName">clear_shift_count[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">clear_shift_count[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/gc_unit_block/tlb_clear_shift_count">
|
||||
<obj_property name="ElementShortName">tlb_clear_shift_count[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">tlb_clear_shift_count[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/gc_issue_hold">
|
||||
<obj_property name="ElementShortName">gc_issue_hold</obj_property>
|
||||
<obj_property name="ObjectShortName">gc_issue_hold</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/gc_issue_flush">
|
||||
<obj_property name="ElementShortName">gc_issue_flush</obj_property>
|
||||
<obj_property name="ObjectShortName">gc_issue_flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/gc_fetch_hold">
|
||||
<obj_property name="ElementShortName">gc_fetch_hold</obj_property>
|
||||
<obj_property name="ObjectShortName">gc_fetch_hold</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/gc_fetch_flush">
|
||||
<obj_property name="ElementShortName">gc_fetch_flush</obj_property>
|
||||
<obj_property name="ObjectShortName">gc_fetch_flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/gc_unit_block/inuse_clear">
|
||||
<obj_property name="ElementShortName">inuse_clear</obj_property>
|
||||
<obj_property name="ObjectShortName">inuse_clear</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider7359" type="divider">
|
||||
<obj_property name="label">Decode/Issue</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/dec_pc">
|
||||
<obj_property name="ElementShortName">dec_pc[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">dec_pc[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/ddr_interface/dec_inst_text">
|
||||
<obj_property name="ElementShortName">dec_inst_text[0:511]</obj_property>
|
||||
<obj_property name="ObjectShortName">dec_inst_text[0:511]</obj_property>
|
||||
<obj_property name="Radix">ASCIIRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/decode_block/ib/data_out.instruction">
|
||||
<obj_property name="ElementShortName">.instruction[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">.instruction[31:0]</obj_property>
|
||||
<obj_property name="Radix">HEXRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/instruction_complete">
|
||||
<obj_property name="ElementShortName">instruction_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">instruction_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/issue_valid">
|
||||
<obj_property name="ElementShortName">issue_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">issue_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/operands_ready">
|
||||
<obj_property name="ElementShortName">operands_ready</obj_property>
|
||||
<obj_property name="ObjectShortName">operands_ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/advance">
|
||||
<obj_property name="ElementShortName">advance</obj_property>
|
||||
<obj_property name="ObjectShortName">advance</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/decode_block/new_request">
|
||||
<obj_property name="ElementShortName">new_request[6:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">new_request[6:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/decode_block/issue_ready">
|
||||
<obj_property name="ElementShortName">issue_ready[6:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">issue_ready[6:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/decode_block/issue">
|
||||
<obj_property name="ElementShortName">issue[6:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">issue[6:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/write_back_mux/inorder">
|
||||
<obj_property name="ElementShortName">inorder</obj_property>
|
||||
<obj_property name="ObjectShortName">inorder</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/bt/flush">
|
||||
<obj_property name="ElementShortName">flush</obj_property>
|
||||
<obj_property name="ObjectShortName">flush</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/rs1_feedforward">
|
||||
<obj_property name="ElementShortName">rs1_feedforward</obj_property>
|
||||
<obj_property name="ObjectShortName">rs1_feedforward</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/rs2_feedforward">
|
||||
<obj_property name="ElementShortName">rs2_feedforward</obj_property>
|
||||
<obj_property name="ObjectShortName">rs2_feedforward</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/uses_rs1">
|
||||
<obj_property name="ElementShortName">uses_rs1</obj_property>
|
||||
<obj_property name="ObjectShortName">uses_rs1</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/uses_rs2">
|
||||
<obj_property name="ElementShortName">uses_rs2</obj_property>
|
||||
<obj_property name="ObjectShortName">uses_rs2</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/decode_block/uses_rd">
|
||||
<obj_property name="ElementShortName">uses_rd</obj_property>
|
||||
<obj_property name="ObjectShortName">uses_rd</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/decode_block/future_rd_addr">
|
||||
<obj_property name="ElementShortName">future_rd_addr[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">future_rd_addr[4:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/bt_block/miss_predict_br">
|
||||
<obj_property name="ElementShortName">miss_predict_br[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">miss_predict_br[31:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/bt_block/miss_predict_ret">
|
||||
<obj_property name="ElementShortName">miss_predict_ret[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">miss_predict_ret[31:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider3002" type="divider">
|
||||
<obj_property name="label">Register File</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/sim_register">
|
||||
<obj_property name="ElementShortName">sim_register</obj_property>
|
||||
<obj_property name="ObjectShortName">sim_register</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/rf_wb/valid_write">
|
||||
<obj_property name="ElementShortName">valid_write</obj_property>
|
||||
<obj_property name="ObjectShortName">valid_write</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/rf_wb/rd_addr">
|
||||
<obj_property name="ElementShortName">rd_addr[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_addr[4:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/inorder">
|
||||
<obj_property name="ElementShortName">inorder</obj_property>
|
||||
<obj_property name="ObjectShortName">inorder</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/clr">
|
||||
<obj_property name="ElementShortName">clr</obj_property>
|
||||
<obj_property name="ObjectShortName">clr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/bankA">
|
||||
<obj_property name="ElementShortName">bankA[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">bankA[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/bankB">
|
||||
<obj_property name="ElementShortName">bankB[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">bankB[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/w_clear">
|
||||
<obj_property name="ElementShortName">w_clear[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">w_clear[4:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/rs1_inuse">
|
||||
<obj_property name="ElementShortName">rs1_inuse</obj_property>
|
||||
<obj_property name="ObjectShortName">rs1_inuse</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/rs2_inuse">
|
||||
<obj_property name="ElementShortName">rs2_inuse</obj_property>
|
||||
<obj_property name="ObjectShortName">rs2_inuse</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/inuse_mem/sim_inuse">
|
||||
<obj_property name="ElementShortName">sim_inuse[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">sim_inuse[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/register_file_block/in_use_match">
|
||||
<obj_property name="ElementShortName">in_use_match</obj_property>
|
||||
<obj_property name="ObjectShortName">in_use_match</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/register_file_block/in_use_by">
|
||||
<obj_property name="ElementShortName">in_use_by[0:31][1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">in_use_by[0:31][1:0]</obj_property>
|
||||
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider3001" type="divider">
|
||||
<obj_property name="label">WB & Inst queue</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/inst_queue/iq/new_issue">
|
||||
<obj_property name="ElementShortName">new_issue</obj_property>
|
||||
<obj_property name="ObjectShortName">new_issue</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/iq/data_in">
|
||||
<obj_property name="ElementShortName">data_in</obj_property>
|
||||
<obj_property name="ObjectShortName">data_in</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/inst_queue/iq/wb/valid">
|
||||
<obj_property name="ElementShortName">valid[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">valid[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/iq/data_out">
|
||||
<obj_property name="ElementShortName">data_out[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">data_out[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/iq/pop">
|
||||
<obj_property name="ElementShortName">pop[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">pop[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/unit_id">
|
||||
<obj_property name="ElementShortName">unit_id[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_id[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/rd_addr">
|
||||
<obj_property name="ElementShortName">rd_addr[4:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_addr[4:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/write_back_mux/rd_addr_not_zero">
|
||||
<obj_property name="ElementShortName">rd_addr_not_zero</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_addr_not_zero</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/issue_id">
|
||||
<obj_property name="ElementShortName">issue_id[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">issue_id[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/write_back_mux/entry_found">
|
||||
<obj_property name="ElementShortName">entry_found</obj_property>
|
||||
<obj_property name="ObjectShortName">entry_found</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/iq_index">
|
||||
<obj_property name="ElementShortName">iq_index[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">iq_index[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/done_on_first_cycle">
|
||||
<obj_property name="ElementShortName">done_on_first_cycle[5:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">done_on_first_cycle[5:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/done_next_cycle">
|
||||
<obj_property name="ElementShortName">done_next_cycle[5:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">done_next_cycle[5:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/write_back_mux/iq/wb_accepting_input">
|
||||
<obj_property name="ElementShortName">wb_accepting_input</obj_property>
|
||||
<obj_property name="ObjectShortName">wb_accepting_input</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/write_back_mux/selected_unit_done_next_cycle">
|
||||
<obj_property name="ElementShortName">selected_unit_done_next_cycle</obj_property>
|
||||
<obj_property name="ObjectShortName">selected_unit_done_next_cycle</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/write_back_mux/accepted">
|
||||
<obj_property name="ElementShortName">accepted[5:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">accepted[5:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider3000" type="divider">
|
||||
<obj_property name="label">LS Unit</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/ls_inputs">
|
||||
<obj_property name="ElementShortName">ls_inputs</obj_property>
|
||||
<obj_property name="ObjectShortName">ls_inputs</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/last_unit">
|
||||
<obj_property name="ElementShortName">last_unit[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">last_unit[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/current_unit">
|
||||
<obj_property name="ElementShortName">current_unit[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">current_unit[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/unit_stall">
|
||||
<obj_property name="ElementShortName">unit_stall</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_stall</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/issue_request">
|
||||
<obj_property name="ElementShortName">issue_request</obj_property>
|
||||
<obj_property name="ObjectShortName">issue_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/inflight_count">
|
||||
<obj_property name="ElementShortName">inflight_count[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">inflight_count[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/ls_input_fifo/read_index">
|
||||
<obj_property name="ElementShortName">read_index[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">read_index[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/stage1">
|
||||
<obj_property name="ElementShortName">stage1</obj_property>
|
||||
<obj_property name="ObjectShortName">stage1</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/d_inputs">
|
||||
<obj_property name="ElementShortName">d_inputs</obj_property>
|
||||
<obj_property name="ObjectShortName">d_inputs</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/sub_unit_address_match">
|
||||
<obj_property name="ElementShortName">sub_unit_address_match[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">sub_unit_address_match[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/unit_ready">
|
||||
<obj_property name="ElementShortName">unit_ready[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_ready[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/unit_data_valid">
|
||||
<obj_property name="ElementShortName">unit_data_valid[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_data_valid[2:0]</obj_property>
|
||||
<obj_property name="CustomSignalColor">#FFD700</obj_property>
|
||||
<obj_property name="UseCustomSignalColor">true</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk6.d_bram /data_bram/en">
|
||||
<obj_property name="ElementShortName">en</obj_property>
|
||||
<obj_property name="ObjectShortName">en</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/load_complete">
|
||||
<obj_property name="ElementShortName">load_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">load_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/unit_data_valid">
|
||||
<obj_property name="ElementShortName">unit_data_valid[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_data_valid[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/unit_data_array">
|
||||
<obj_property name="ElementShortName">unit_data_array[2:0][31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">unit_data_array[2:0][31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/final_load_data">
|
||||
<obj_property name="ElementShortName">final_load_data[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">final_load_data[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider2999" type="divider">
|
||||
<obj_property name="label">DCache</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /ls/data_valid">
|
||||
<obj_property name="ElementShortName">data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /ls/ready">
|
||||
<obj_property name="ElementShortName">ready</obj_property>
|
||||
<obj_property name="ObjectShortName">ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /ls/new_request">
|
||||
<obj_property name="ElementShortName">new_request</obj_property>
|
||||
<obj_property name="ObjectShortName">new_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/wb_fifo/full">
|
||||
<obj_property name="ElementShortName">full</obj_property>
|
||||
<obj_property name="ObjectShortName">full</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /second_cycle">
|
||||
<obj_property name="ElementShortName">second_cycle</obj_property>
|
||||
<obj_property name="ObjectShortName">second_cycle</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /request">
|
||||
<obj_property name="ElementShortName">request</obj_property>
|
||||
<obj_property name="ObjectShortName">request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /tag_hit">
|
||||
<obj_property name="ElementShortName">tag_hit</obj_property>
|
||||
<obj_property name="ObjectShortName">tag_hit</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /line_complete">
|
||||
<obj_property name="ElementShortName">line_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">line_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /read_miss_complete">
|
||||
<obj_property name="ElementShortName">read_miss_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">read_miss_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /store_complete">
|
||||
<obj_property name="ElementShortName">store_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">store_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /idle">
|
||||
<obj_property name="ElementShortName">idle</obj_property>
|
||||
<obj_property name="ObjectShortName">idle</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/load_attributes/valid">
|
||||
<obj_property name="ElementShortName">valid</obj_property>
|
||||
<obj_property name="ObjectShortName">valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /replacement_policy/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /replacement_policy/rst">
|
||||
<obj_property name="ElementShortName">rst</obj_property>
|
||||
<obj_property name="ObjectShortName">rst</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /replacement_policy/en">
|
||||
<obj_property name="ElementShortName">en</obj_property>
|
||||
<obj_property name="ObjectShortName">en</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /replacement_policy/one_hot">
|
||||
<obj_property name="ElementShortName">one_hot[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">one_hot[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /replacement_policy/C_WIDTH">
|
||||
<obj_property name="ElementShortName">C_WIDTH[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">C_WIDTH[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /update_way_conv/one_hot">
|
||||
<obj_property name="ElementShortName">one_hot[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">one_hot[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /update_way_conv/int_out">
|
||||
<obj_property name="ElementShortName">int_out[0:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">int_out[0:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/load_store_unit_block/\genblk8.data_cache /update_way_conv/C_WIDTH">
|
||||
<obj_property name="ElementShortName">C_WIDTH[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">C_WIDTH[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider2998" type="divider">
|
||||
<obj_property name="label">L2</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/\genblk1.arb /requests">
|
||||
<obj_property name="ElementShortName">requests[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">requests[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/\genblk1.arb /acks">
|
||||
<obj_property name="ElementShortName">acks[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">acks[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/\genblk1.arb /push_ready">
|
||||
<obj_property name="ElementShortName">push_ready</obj_property>
|
||||
<obj_property name="ObjectShortName">push_ready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/\genblk1.arb /request_exists">
|
||||
<obj_property name="ElementShortName">request_exists</obj_property>
|
||||
<obj_property name="ObjectShortName">request_exists</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/uut/\genblk1.arb /busy">
|
||||
<obj_property name="ElementShortName">busy</obj_property>
|
||||
<obj_property name="ObjectShortName">busy</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/uut/\genblk1.arb /l2_requests">
|
||||
<obj_property name="ElementShortName">l2_requests[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">l2_requests[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/\request[0] /request">
|
||||
<obj_property name="ElementShortName">request</obj_property>
|
||||
<obj_property name="ObjectShortName">request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /request_push">
|
||||
<obj_property name="ElementShortName">request_push</obj_property>
|
||||
<obj_property name="ObjectShortName">request_push</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/requests">
|
||||
<obj_property name="ElementShortName">requests[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">requests[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/arb/requests">
|
||||
<obj_property name="ElementShortName">requests[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">requests[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/arb/grantee_i">
|
||||
<obj_property name="ElementShortName">grantee_i[0:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">grantee_i[0:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/arb/grantee_v">
|
||||
<obj_property name="ElementShortName">grantee_v[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">grantee_v[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/arb/grantee_valid">
|
||||
<obj_property name="ElementShortName">grantee_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">grantee_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/arb/strobe">
|
||||
<obj_property name="ElementShortName">strobe</obj_property>
|
||||
<obj_property name="ObjectShortName">strobe</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\input_fifos[0] /pop">
|
||||
<obj_property name="ElementShortName">pop</obj_property>
|
||||
<obj_property name="ObjectShortName">pop</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /request_full">
|
||||
<obj_property name="ElementShortName">request_full</obj_property>
|
||||
<obj_property name="ObjectShortName">request_full</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/advance">
|
||||
<obj_property name="ElementShortName">advance</obj_property>
|
||||
<obj_property name="ObjectShortName">advance</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/\request[0] /inv_addr">
|
||||
<obj_property name="ElementShortName">inv_addr[31:2]</obj_property>
|
||||
<obj_property name="ObjectShortName">inv_addr[31:2]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /inv_valid">
|
||||
<obj_property name="ElementShortName">inv_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">inv_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /inv_ack">
|
||||
<obj_property name="ElementShortName">inv_ack</obj_property>
|
||||
<obj_property name="ObjectShortName">inv_ack</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /con_result">
|
||||
<obj_property name="ElementShortName">con_result</obj_property>
|
||||
<obj_property name="ObjectShortName">con_result</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /con_valid">
|
||||
<obj_property name="ElementShortName">con_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">con_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/\request[0] /wr_data">
|
||||
<obj_property name="ElementShortName">wr_data[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">wr_data[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /wr_data_push">
|
||||
<obj_property name="ElementShortName">wr_data_push</obj_property>
|
||||
<obj_property name="ObjectShortName">wr_data_push</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /data_full">
|
||||
<obj_property name="ElementShortName">data_full</obj_property>
|
||||
<obj_property name="ObjectShortName">data_full</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/\request[0] /rd_data">
|
||||
<obj_property name="ElementShortName">rd_data[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_data[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/\request[0] /rd_sub_id">
|
||||
<obj_property name="ElementShortName">rd_sub_id[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_sub_id[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /rd_data_valid">
|
||||
<obj_property name="ElementShortName">rd_data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/\request[0] /rd_data_ack">
|
||||
<obj_property name="ElementShortName">rd_data_ack</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_data_ack</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/mem/request">
|
||||
<obj_property name="ElementShortName">request</obj_property>
|
||||
<obj_property name="ObjectShortName">request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/request_pop">
|
||||
<obj_property name="ElementShortName">request_pop</obj_property>
|
||||
<obj_property name="ObjectShortName">request_pop</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/request_valid">
|
||||
<obj_property name="ElementShortName">request_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">request_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/abort_request">
|
||||
<obj_property name="ElementShortName">abort_request</obj_property>
|
||||
<obj_property name="ObjectShortName">abort_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/mem/wr_data">
|
||||
<obj_property name="ElementShortName">wr_data[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">wr_data[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/wr_data_valid">
|
||||
<obj_property name="ElementShortName">wr_data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">wr_data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/wr_data_read">
|
||||
<obj_property name="ElementShortName">wr_data_read</obj_property>
|
||||
<obj_property name="ObjectShortName">wr_data_read</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/mem/rd_data">
|
||||
<obj_property name="ElementShortName">rd_data[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_data[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/mem/rd_id">
|
||||
<obj_property name="ElementShortName">rd_id[2:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_id[2:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/mem/rd_data_valid">
|
||||
<obj_property name="ElementShortName">rd_data_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">rd_data_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/reserv_valid">
|
||||
<obj_property name="ElementShortName">reserv_valid</obj_property>
|
||||
<obj_property name="ObjectShortName">reserv_valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/reserv_request">
|
||||
<obj_property name="ElementShortName">reserv_request</obj_property>
|
||||
<obj_property name="ObjectShortName">reserv_request</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/reserv_id">
|
||||
<obj_property name="ElementShortName">reserv_id[0:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">reserv_id[0:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/reserv_id_v">
|
||||
<obj_property name="ElementShortName">reserv_id_v[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">reserv_id_v[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/new_attr">
|
||||
<obj_property name="ElementShortName">new_attr</obj_property>
|
||||
<obj_property name="ObjectShortName">new_attr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/data_attributes_fifo/\genblk1.genblk1.lut_ram ">
|
||||
<obj_property name="ElementShortName">\genblk1.genblk1.lut_ram [15:0][6:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">\genblk1.genblk1.lut_ram [15:0][6:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/data_attributes_fifo/\genblk1.genblk1.read_index ">
|
||||
<obj_property name="ElementShortName">\genblk1.genblk1.read_index [3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">\genblk1.genblk1.read_index [3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/data_attributes_fifo/\genblk1.genblk1.write_index ">
|
||||
<obj_property name="ElementShortName">\genblk1.genblk1.write_index [3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">\genblk1.genblk1.write_index [3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_arb/current_attr">
|
||||
<obj_property name="ElementShortName">current_attr</obj_property>
|
||||
<obj_property name="ObjectShortName">current_attr</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/data_attributes/valid">
|
||||
<obj_property name="ElementShortName">valid</obj_property>
|
||||
<obj_property name="ObjectShortName">valid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/data_attributes/push">
|
||||
<obj_property name="ElementShortName">push</obj_property>
|
||||
<obj_property name="ObjectShortName">push</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_arb/data_attributes/pop">
|
||||
<obj_property name="ElementShortName">pop</obj_property>
|
||||
<obj_property name="ObjectShortName">pop</obj_property>
|
||||
</wvobject>
|
||||
<wvobject fp_name="divider2818" type="divider">
|
||||
<obj_property name="label">Mem AXI</obj_property>
|
||||
<obj_property name="DisplayName">label</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/clk">
|
||||
<obj_property name="ElementShortName">clk</obj_property>
|
||||
<obj_property name="ObjectShortName">clk</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_araddr">
|
||||
<obj_property name="ElementShortName">axi_araddr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_araddr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_arready">
|
||||
<obj_property name="ElementShortName">axi_arready</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_arready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_arvalid">
|
||||
<obj_property name="ElementShortName">axi_arvalid</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_arvalid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_rready">
|
||||
<obj_property name="ElementShortName">axi_rready</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_rready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_rvalid">
|
||||
<obj_property name="ElementShortName">axi_rvalid</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_rvalid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_awburst">
|
||||
<obj_property name="ElementShortName">axi_awburst[1:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_awburst[1:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_rdata">
|
||||
<obj_property name="ElementShortName">axi_rdata[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_rdata[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_awaddr">
|
||||
<obj_property name="ElementShortName">axi_awaddr[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_awaddr[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_awready">
|
||||
<obj_property name="ElementShortName">axi_awready</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_awready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_awvalid">
|
||||
<obj_property name="ElementShortName">axi_awvalid</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_awvalid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_wready">
|
||||
<obj_property name="ElementShortName">axi_wready</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_wready</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_wvalid">
|
||||
<obj_property name="ElementShortName">axi_wvalid</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_wvalid</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/axi_wlast">
|
||||
<obj_property name="ElementShortName">axi_wlast</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_wlast</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_wdata">
|
||||
<obj_property name="ElementShortName">axi_wdata[31:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_wdata[31:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/l2_to_mem/axi_wstrb">
|
||||
<obj_property name="ElementShortName">axi_wstrb[3:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">axi_wstrb[3:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/write_in_progress">
|
||||
<obj_property name="ElementShortName">write_in_progress</obj_property>
|
||||
<obj_property name="ObjectShortName">write_in_progress</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="logic" fp_name="/cva5_tb/l2_to_mem/write_transfer_complete">
|
||||
<obj_property name="ElementShortName">write_transfer_complete</obj_property>
|
||||
<obj_property name="ObjectShortName">write_transfer_complete</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/ddr_interface/write_request_count">
|
||||
<obj_property name="ElementShortName">write_request_count[47:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">write_request_count[47:0]</obj_property>
|
||||
</wvobject>
|
||||
<wvobject type="array" fp_name="/cva5_tb/ddr_interface/read_request_count">
|
||||
<obj_property name="ElementShortName">read_request_count[47:0]</obj_property>
|
||||
<obj_property name="ObjectShortName">read_request_count[47:0]</obj_property>
|
||||
</wvobject>
|
||||
</wave_config>
|
|
@ -1,345 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2017 Eric Matthews, Lesley Shannon
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Initial code developed under the supervision of Dr. Lesley Shannon,
|
||||
* Reconfigurable Computing Lab, Simon Fraser University.
|
||||
*
|
||||
* Author(s):
|
||||
* Alec Lu <fla30@sfu.ca>
|
||||
* Eric Matthews <ematthew@sfu.ca>
|
||||
*/
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
import cva5_config::*;
|
||||
import cva5_types::*;
|
||||
|
||||
typedef struct packed{
|
||||
alu_inputs_t module_input;
|
||||
logic [31: 0] expected_result;
|
||||
} alu_result_t;
|
||||
|
||||
module alu_unit_tb();
|
||||
//DUT Regs and Wires
|
||||
logic clk;
|
||||
logic rst;
|
||||
func_unit_ex_interface alu_ex();
|
||||
unit_writeback_interface alu_wb();
|
||||
alu_inputs_t alu_inputs;
|
||||
|
||||
//Internal Regs and Wires
|
||||
integer test_number;
|
||||
|
||||
//Input
|
||||
logic [31: 0] in1_rand;//contains sign padding bit for slt operation
|
||||
logic [31: 0] in2_rand;//contains sign padding bit for slt operation
|
||||
logic subtract_rand;
|
||||
logic arith_rand;//contains sign padding bit for arithmetic shift right operation
|
||||
logic lshift_rand;
|
||||
logic [ 2: 0] fn3_rand;
|
||||
logic [ 1: 0] op_rand;
|
||||
logic [31: 0] result_rand;
|
||||
logic [32: 0] result_rshift;
|
||||
logic [32: 0] result_slt;
|
||||
|
||||
//Result
|
||||
// logic [31: 0] result_queue[$];
|
||||
// logic [31: 0] temp_result;
|
||||
alu_result_t result_queue[$];
|
||||
alu_result_t temp_result;
|
||||
logic [31: 0] alu_wb_rd_d;
|
||||
|
||||
//Latency
|
||||
parameter MAX_RESPONSE_LATENCY = 32'hF;
|
||||
logic wb_done;
|
||||
logic firstPop;
|
||||
logic [31: 0] latency_queue[$];
|
||||
logic [31: 0] wb_done_acc;
|
||||
logic [31: 0] response_latency;
|
||||
|
||||
//DUT
|
||||
alu_unit uut (.*);
|
||||
|
||||
//Reset
|
||||
task reset;
|
||||
begin
|
||||
rst = 1'b1;
|
||||
#100 rst = 1'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
//Clock Gen
|
||||
always
|
||||
#1 clk = ~clk;
|
||||
|
||||
//Latency Logic
|
||||
function int genRandLatency();
|
||||
genRandLatency = $random & MAX_RESPONSE_LATENCY;
|
||||
endfunction
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
wb_done_acc <= 32'h1;
|
||||
firstPop <= 1'b1;
|
||||
response_latency <= 32'hFFFFFFFF;
|
||||
end else begin
|
||||
if (alu_wb.done_next_cycle) begin
|
||||
wb_done_acc <= wb_done_acc + 1;
|
||||
end else begin
|
||||
wb_done_acc <= 32'h1;
|
||||
end
|
||||
|
||||
if (firstPop | alu_wb.accepted) begin
|
||||
response_latency <= latency_queue.pop_front();
|
||||
firstPop <= 1'b0;
|
||||
end else begin
|
||||
response_latency <= response_latency;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign wb_done = alu_wb.done_next_cycle & (wb_done_acc >= response_latency);
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst)
|
||||
alu_wb.accepted <= 0;
|
||||
else
|
||||
alu_wb.accepted <= wb_done;
|
||||
end
|
||||
|
||||
//Output checker
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
alu_wb_rd_d <= 32'h0;
|
||||
end else begin
|
||||
alu_wb_rd_d <= alu_wb.rd;
|
||||
end
|
||||
end
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst)
|
||||
test_number <= 1;
|
||||
if (alu_wb.accepted) begin
|
||||
test_number <= test_number + 1;
|
||||
temp_result = result_queue.pop_front();
|
||||
if (temp_result.expected_result != 32'hxxxxxxxx) begin
|
||||
assert (alu_wb_rd_d == temp_result.expected_result)
|
||||
else $error("Incorrect result on test number %d. (%h, should be: %h)\n\t Input: in1: %d, in2: %d, subtract: %b, arith: %b, lshift: %b, shifter_in: %d, logic_op: %b, op: %b",
|
||||
test_number, alu_wb_rd_d, temp_result.expected_result,
|
||||
temp_result.module_input.in1, temp_result.module_input.in2,
|
||||
temp_result.module_input.subtract, temp_result.module_input.arith,
|
||||
temp_result.module_input.lshift, temp_result.module_input.shifter_in,
|
||||
temp_result.module_input.logic_op, temp_result.module_input.op);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//Driver
|
||||
task test_alu (
|
||||
input logic [XLEN:0] in1,
|
||||
input logic [XLEN:0] in2,
|
||||
input logic subtract,
|
||||
input logic arith,
|
||||
input logic lshift,
|
||||
input logic [ 2: 0] fn3,
|
||||
input logic [ 1: 0] op,
|
||||
input logic [31: 0] latency,
|
||||
input logic [XLEN-1:0] result
|
||||
);
|
||||
wait (~clk & alu_ex.ready);
|
||||
alu_inputs.in1 = in1;
|
||||
alu_inputs.in2 = in2;
|
||||
alu_inputs.subtract = subtract;
|
||||
alu_inputs.arith = arith;
|
||||
alu_inputs.lshift = lshift;
|
||||
alu_inputs.shifter_in <= lshift ? {<<{in1}} : in1;
|
||||
|
||||
case (fn3)
|
||||
SLT_fn3 : alu_inputs.logic_op = ALU_LOGIC_ADD;
|
||||
SLTU_fn3 : alu_inputs.logic_op = ALU_LOGIC_ADD;
|
||||
SLL_fn3 : alu_inputs.logic_op = ALU_LOGIC_ADD;
|
||||
XOR_fn3 : alu_inputs.logic_op = ALU_LOGIC_XOR;
|
||||
OR_fn3 : alu_inputs.logic_op = ALU_LOGIC_OR;
|
||||
AND_fn3 : alu_inputs.logic_op = ALU_LOGIC_AND;
|
||||
SRA_fn3 : alu_inputs.logic_op = ALU_LOGIC_ADD;
|
||||
ADD_SUB_fn3 : alu_inputs.logic_op = ALU_LOGIC_ADD;
|
||||
endcase
|
||||
|
||||
alu_inputs.op = op;
|
||||
result_queue.push_back({alu_inputs, result});
|
||||
latency_queue.push_back(latency);
|
||||
alu_ex.new_request_dec = 1; #2
|
||||
alu_ex.new_request_dec = 0;
|
||||
endtask
|
||||
|
||||
//Generator + Transaction
|
||||
task test_gen();
|
||||
//TODO: move all randomizing parameters out here
|
||||
op_rand = $urandom % 4;
|
||||
in1_rand = $random;
|
||||
in2_rand = $random;
|
||||
subtract_rand = $urandom % 2;
|
||||
fn3_rand = $urandom % 8;
|
||||
lshift_rand = $urandom % 2;
|
||||
arith_rand = $urandom % 2;
|
||||
|
||||
//SW model
|
||||
case (op_rand)
|
||||
ALU_ADD_SUB: begin
|
||||
case (fn3_rand)
|
||||
XOR_fn3 : begin result_rand = in1_rand ^ in2_rand; subtract_rand = 0; end
|
||||
OR_fn3 : begin result_rand = in1_rand | in2_rand; subtract_rand = 0; end
|
||||
AND_fn3 : begin result_rand = in1_rand & in2_rand; subtract_rand = 0; end
|
||||
default : result_rand = subtract_rand ? in1_rand - in2_rand : in1_rand + in2_rand;
|
||||
endcase
|
||||
end
|
||||
ALU_SLT: begin
|
||||
subtract_rand = 1;
|
||||
fn3_rand = 0;
|
||||
result_slt = {1'b0, in1_rand} - {1'b0, in2_rand};
|
||||
result_rand = {31'b0, result_slt[32]};
|
||||
end
|
||||
default: begin //ALU_SHIFT
|
||||
if (lshift_rand) begin
|
||||
arith_rand = 0;
|
||||
result_rand = in1_rand << in2_rand[4:0];
|
||||
end else begin
|
||||
result_rshift = signed'({arith_rand,in1_rand}) >>> in2_rand[4:0];
|
||||
result_rand = result_rshift[31:0];
|
||||
end
|
||||
end
|
||||
endcase
|
||||
|
||||
test_alu({1'b0, in1_rand}, {1'b0, in2_rand}, subtract_rand, arith_rand, lshift_rand, fn3_rand, op_rand, genRandLatency(), result_rand);
|
||||
endtask
|
||||
|
||||
initial
|
||||
begin
|
||||
clk = 0;
|
||||
rst = 1;
|
||||
alu_inputs.in1 = 0;
|
||||
alu_inputs.in2 = 0;
|
||||
alu_inputs.subtract = 0;
|
||||
alu_inputs.arith = 0;
|
||||
alu_inputs.lshift = 0;
|
||||
alu_inputs.logic_op = 0;
|
||||
alu_inputs.op = 0;
|
||||
alu_ex.new_request_dec = 0;
|
||||
alu_wb.accepted = 0;
|
||||
|
||||
reset();
|
||||
|
||||
for (int i=0; i < 6; i = i+5)
|
||||
begin
|
||||
//ALU_ADD_SUB = 2'b00,
|
||||
// Add
|
||||
test_alu(33'h00000000, 33'h00000000, 1'b0, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'h00000000);
|
||||
test_alu(33'h00000001, 33'h00000001, 1'b0, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'h00000002);
|
||||
test_alu(33'h00000003, 33'h00000007, 1'b0, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'h0000000a);
|
||||
// Sub
|
||||
test_alu(33'h00000000, 33'h00000000, 1'b1, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'h00000000);
|
||||
test_alu(33'h00000001, 33'h00000001, 1'b1, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'h00000000);
|
||||
test_alu(33'h00000003, 33'h00000007, 1'b1, 1'b0, 1'b0, 3'b000, 2'b00, i, 32'hfffffffc);
|
||||
|
||||
//ALU_LOGIC = 2'b01
|
||||
// AND
|
||||
test_alu(33'hff00ff00, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b111, 2'b00, i, 32'h0f000f00);
|
||||
test_alu(33'h0ff00ff0, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b111, 2'b00, i, 32'h00f000f0);
|
||||
test_alu(33'h00ff00ff, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b111, 2'b00, i, 32'h000f000f);
|
||||
test_alu(33'hf00ff00f, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b111, 2'b00, i, 32'hf000f000);
|
||||
// OR
|
||||
test_alu(33'hff00ff00, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b110, 2'b00, i, 32'hff0fff0f);
|
||||
test_alu(33'h0ff00ff0, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b110, 2'b00, i, 32'hfff0fff0);
|
||||
test_alu(33'h00ff00ff, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b110, 2'b00, i, 32'h0fff0fff);
|
||||
test_alu(33'hf00ff00f, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b110, 2'b00, i, 32'hf0fff0ff);
|
||||
// XOR
|
||||
test_alu(33'hff00ff00, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b100, 2'b00, i, 32'hf00ff00f);
|
||||
test_alu(33'h0ff00ff0, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b100, 2'b00, i, 32'hff00ff00);
|
||||
test_alu(33'h00ff00ff, 33'h0f0f0f0f, 1'b0, 1'b0, 1'b0, 3'b100, 2'b00, i, 32'h0ff00ff0);
|
||||
test_alu(33'hf00ff00f, 33'hf0f0f0f0, 1'b0, 1'b0, 1'b0, 3'b100, 2'b00, i, 32'h00ff00ff);
|
||||
|
||||
//ALU_SLT = 2'b10
|
||||
// Add
|
||||
test_alu(33'h00000000, 33'h00000000, 1'b0, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h0);
|
||||
test_alu(33'h00000001, 33'h00000001, 1'b0, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h0);
|
||||
test_alu(33'h00000003, 33'h00000007, 1'b0, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h0);
|
||||
// Sub
|
||||
test_alu(33'h00000000, 33'h00000000, 1'b1, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h0);
|
||||
test_alu(33'h00000001, 33'h00000001, 1'b1, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h0);
|
||||
test_alu(33'h00000003, 33'h00000007, 1'b1, 1'b0, 1'b0, 3'b000, 2'b01, i, 32'h1);
|
||||
|
||||
//ALU_SHIFT =2'b11
|
||||
// SLL
|
||||
test_alu(33'h00000001, 33'h00000000, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h00000001);
|
||||
test_alu(33'h00000001, 33'h00000001, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h00000002);
|
||||
test_alu(33'h00000001, 33'h00000007, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h00000080);
|
||||
test_alu(33'h00000001, 33'h0000000E, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h00004000);
|
||||
test_alu(33'h00000001, 33'h0000001F, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h80000000);
|
||||
test_alu(33'hffffffff, 33'h00000000, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'hffffffff);
|
||||
test_alu(33'hffffffff, 33'h00000001, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'hfffffffe);
|
||||
test_alu(33'hffffffff, 33'h00000007, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'hffffff80);
|
||||
test_alu(33'hffffffff, 33'h0000000E, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'hffffc000);
|
||||
test_alu(33'hffffffff, 33'h0000001F, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h80000000);
|
||||
test_alu(33'h21212121, 33'h00000000, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h21212121);
|
||||
test_alu(33'h21212121, 33'h00000001, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h42424242);
|
||||
test_alu(33'h21212121, 33'h00000007, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h90909080);
|
||||
test_alu(33'h21212121, 33'h0000000E, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h48484000);
|
||||
test_alu(33'h21212121, 33'h0000001F, 1'b0, 1'b0, 1'b1, 3'b000, 2'b10, i, 32'h80000000);
|
||||
// SRL
|
||||
test_alu(33'h80000000, 33'h00000000, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h80000000);
|
||||
test_alu(33'h80000000, 33'h00000001, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h40000000);
|
||||
test_alu(33'h80000000, 33'h00000007, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h01000000);
|
||||
test_alu(33'h80000000, 33'h0000000E, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00020000);
|
||||
test_alu(33'h80000000, 33'h0000001F, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00000001);
|
||||
test_alu(33'h7fffffff, 33'h00000000, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h7fffffff);
|
||||
test_alu(33'h7fffffff, 33'h00000001, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h3fffffff);
|
||||
test_alu(33'h7fffffff, 33'h00000007, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00ffffff);
|
||||
test_alu(33'h7fffffff, 33'h0000000E, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h0001ffff);
|
||||
test_alu(33'h7fffffff, 33'h0000001F, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00000000);
|
||||
test_alu(33'h81818181, 33'h00000000, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h81818181);
|
||||
test_alu(33'h81818181, 33'h00000001, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h40c0c0c0);
|
||||
test_alu(33'h81818181, 33'h00000007, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h01030303);
|
||||
test_alu(33'h81818181, 33'h0000000E, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00020606);
|
||||
test_alu(33'h81818181, 33'h0000001F, 1'b0, 1'b0, 1'b0, 3'b000, 2'b10, i, 32'h00000001);
|
||||
// SRA
|
||||
test_alu(33'h80000000, 33'h00000000, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'h80000000);
|
||||
test_alu(33'h80000000, 33'h00000001, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hc0000000);
|
||||
test_alu(33'h80000000, 33'h00000007, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hff000000);
|
||||
test_alu(33'h80000000, 33'h0000000E, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hfffe0000);
|
||||
test_alu(33'h80000000, 33'h0000001F, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hffffffff);
|
||||
test_alu(33'h81818181, 33'h00000000, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'h81818181);
|
||||
test_alu(33'h81818181, 33'h00000001, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hc0c0c0c0);
|
||||
test_alu(33'h81818181, 33'h00000007, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hff030303);
|
||||
test_alu(33'h81818181, 33'h0000000E, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hfffe0606);
|
||||
test_alu(33'h81818181, 33'h0000001F, 1'b0, 1'b1, 1'b0, 3'b000, 2'b10, i, 32'hffffffff);
|
||||
end
|
||||
|
||||
//Randomized Test (operation + latency)
|
||||
for (int i=0; i < 1000; i = i+1) begin
|
||||
test_gen();
|
||||
end
|
||||
|
||||
wait (result_queue.size() == 0);
|
||||
wait (latency_queue.size() == 0);
|
||||
#200;
|
||||
if (result_queue.size() == 0) begin
|
||||
// $display("queue size: %d", result_queue.size());
|
||||
$display("ALU Unit Test -------------------- Passed");
|
||||
end
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,303 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2017 Eric Matthews, Lesley Shannon
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Initial code developed under the supervision of Dr. Lesley Shannon,
|
||||
* Reconfigurable Computing Lab, Simon Fraser University.
|
||||
*
|
||||
* Author(s):
|
||||
* Eric Matthews <ematthew@sfu.ca>
|
||||
* Alec Lu <fla30@sfu.ca>
|
||||
*/
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
import cva5_config::*;
|
||||
import cva5_types::*;
|
||||
|
||||
typedef struct packed{
|
||||
div_inputs_t module_input;
|
||||
logic [31: 0] expected_result;
|
||||
} div_result_t;
|
||||
|
||||
module div_unit_tb ();
|
||||
//DUT Regs and Wires
|
||||
logic clk;
|
||||
logic rst;
|
||||
logic gc_fetch_flush;
|
||||
unit_issue_interface issue();
|
||||
unit_writeback_t wb;
|
||||
div_inputs_t div_inputs;
|
||||
//Internal Regs and Wires
|
||||
integer test_number;
|
||||
//Input
|
||||
integer rs1_rand;
|
||||
integer rs2_rand;
|
||||
int unsigned rs1_urand;
|
||||
int unsigned rs2_urand;
|
||||
integer result_rand;
|
||||
logic [ 1: 0] op_rand;
|
||||
logic reuse_rand;
|
||||
logic accept;
|
||||
//Result
|
||||
div_result_t result_queue[$];
|
||||
div_result_t temp_result;
|
||||
//Latency
|
||||
parameter MAX_RESPONSE_LATENCY = 32'hF;
|
||||
logic wb_done;
|
||||
logic firstPop;
|
||||
logic [31: 0] latency_queue[$];
|
||||
logic [31: 0] wb_done_acc;
|
||||
logic [31: 0] response_latency;
|
||||
|
||||
//DUT
|
||||
div_unit uut (.*);
|
||||
|
||||
//Reset
|
||||
task reset;
|
||||
begin
|
||||
rst = 1'b1;
|
||||
#100 rst = 1'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
//Clock Gen
|
||||
always
|
||||
#1 clk = ~clk;
|
||||
|
||||
//Latency Logic
|
||||
function int genRandLatency();
|
||||
genRandLatency = $random & MAX_RESPONSE_LATENCY;
|
||||
endfunction
|
||||
|
||||
//With Latency
|
||||
//always_ff @(posedge clk) begin
|
||||
// if (rst) begin
|
||||
// wb_done_acc <= 32'h1;
|
||||
// firstPop <= 1'b1;
|
||||
// response_latency <= 32'hFFFFFFFF;
|
||||
// end else begin
|
||||
// if (wb.done) begin
|
||||
// wb_done_acc <= wb_done_acc + 1;
|
||||
// end else begin
|
||||
// wb_done_acc <= 32'h1;
|
||||
// end
|
||||
|
||||
// if (firstPop | accept) begin
|
||||
// response_latency <= latency_queue.pop_front();
|
||||
// firstPop <= 1'b0;
|
||||
// end else begin
|
||||
// response_latency <= response_latency;
|
||||
// end
|
||||
// end
|
||||
//end
|
||||
//always_ff @(posedge clk) begin
|
||||
// if (rst)
|
||||
// accept <= 0;
|
||||
// else
|
||||
// accept <= wb_done;
|
||||
//end
|
||||
//assign wb_done = wb.done & (wb_done_acc >= response_latency);
|
||||
|
||||
//Without Latency
|
||||
assign wb_done = wb.done;
|
||||
assign accept = wb_done;
|
||||
|
||||
//Output checker
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst)
|
||||
test_number <= 1;
|
||||
if (accept) begin
|
||||
test_number <= test_number + 1;
|
||||
temp_result = result_queue.pop_front();
|
||||
assert (wb.rd == temp_result.expected_result)
|
||||
else $error("Incorrect result on test number %d. (%h, should be: %h)\n\t Input: rs1: %d, rs2: %d, op: %b, reuse_result: %b",
|
||||
test_number, wb.rd, temp_result.expected_result,
|
||||
temp_result.module_input.rs1, temp_result.module_input.rs2,
|
||||
temp_result.module_input.op, temp_result.module_input.reuse_result);
|
||||
end
|
||||
end
|
||||
|
||||
//Driver
|
||||
task test_div (input integer a, b, result, latency, logic[1:0] op, logic reuse);
|
||||
wait (~clk & issue.ready);
|
||||
div_inputs.rs1 = a;
|
||||
div_inputs.rs2 = b;
|
||||
div_inputs.op = op;
|
||||
div_inputs.reuse_result = reuse;
|
||||
div_inputs.instruction_id = 0; //dont care
|
||||
result_queue.push_back({div_inputs, result});
|
||||
latency_queue.push_back(latency);
|
||||
issue.new_request = 1; #2
|
||||
issue.new_request = 0;
|
||||
endtask
|
||||
|
||||
//Generator + Transaction
|
||||
task test_gen();
|
||||
op_rand = $urandom % 4;
|
||||
rs1_rand = $random;
|
||||
rs2_rand = $random;
|
||||
reuse_rand = 0;
|
||||
|
||||
//SW model
|
||||
case (op_rand)
|
||||
2'b00:begin //Div
|
||||
if (rs2_rand == 0) begin
|
||||
result_rand = -1;
|
||||
end else begin
|
||||
result_rand = rs1_rand / rs2_rand;
|
||||
end
|
||||
end
|
||||
2'b01:begin //uDiv
|
||||
if (rs2_rand == 0) begin
|
||||
result_rand = -1;
|
||||
end else begin
|
||||
rs1_urand = rs1_rand;
|
||||
rs2_urand = rs2_rand;
|
||||
result_rand = rs1_urand / rs2_urand;
|
||||
end
|
||||
end
|
||||
2'b10:begin //Rem
|
||||
if (rs2_rand == 0) begin
|
||||
result_rand = rs1_rand;
|
||||
end else begin
|
||||
result_rand = rs1_rand % rs2_rand;
|
||||
end
|
||||
end
|
||||
2'b11:begin //uRem
|
||||
if (rs2_rand == 0) begin
|
||||
result_rand = rs1_rand;
|
||||
end else begin
|
||||
rs1_urand = rs1_rand;
|
||||
rs2_urand = rs2_rand;
|
||||
result_rand = rs1_urand % rs2_urand;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
|
||||
test_div (rs1_rand, rs2_rand, result_rand, genRandLatency(), op_rand, reuse_rand);
|
||||
endtask
|
||||
|
||||
initial
|
||||
begin
|
||||
clk = 0;
|
||||
rst = 1;
|
||||
gc_fetch_flush = 0;
|
||||
div_inputs.rs1 = 0;
|
||||
div_inputs.rs2 = 0;
|
||||
div_inputs.op = 0;
|
||||
div_inputs.reuse_result = 0;
|
||||
issue.new_request = 0;
|
||||
|
||||
reset();
|
||||
|
||||
// //Randomized Test (operation + latency)
|
||||
// for (int i=0; i < 5000; i = i+1) begin
|
||||
// test_gen();
|
||||
// end
|
||||
|
||||
for (int i=0; i < 6; i = i+5) begin
|
||||
//Div test
|
||||
test_div( 20, 6, 3, i, 2'b00, 0);
|
||||
test_div(-20, -3, 6, i, 2'b00, 0);
|
||||
test_div(-20, 6, -3, i, 2'b00, 0);
|
||||
test_div( 20, -6, -3, i, 2'b00, 0);
|
||||
test_div(-20, -6, 3, i, 2'b00, 0);
|
||||
|
||||
test_div(-1<<31, 1, -1<<31, i, 2'b00, 0);
|
||||
test_div(-1<<31, -1, -1<<31, i, 2'b00, 0);
|
||||
|
||||
test_div(-1<<31, 0, -1, i, 2'b00, 0);
|
||||
test_div(-1, 0, -1, i, 2'b00, 0);
|
||||
test_div(0, 0, -1, i, 2'b00, 0);
|
||||
|
||||
//uDiv test
|
||||
test_div( 20, 6, 3, i, 2'b01, 0);
|
||||
test_div(-20, 6, 715827879, i, 2'b01, 0);
|
||||
test_div( 20, -6, 0, i, 2'b01, 0);
|
||||
test_div(-20, -6, 0, i, 2'b01, 0);
|
||||
|
||||
test_div(-1<<31, 1, -1<<31, i, 2'b01, 0);
|
||||
test_div(-1<<31, -1, 0, i, 2'b01, 0);
|
||||
|
||||
test_div(-1<<31, 0, -1, i, 2'b01, 0);
|
||||
test_div( 1, 0, -1, i, 2'b01, 0);
|
||||
test_div( 0, 0, -1, i, 2'b01, 0);
|
||||
|
||||
test_div(486456, 1, 486456, i, 2'b01, 0);
|
||||
test_div( 200, 200, 1, i, 2'b01, 0);
|
||||
test_div(234678, 2, 234678/2, i, 2'b01, 0);
|
||||
|
||||
//rem test
|
||||
test_div( 20, 6, 2, i, 2'b10, 0);
|
||||
test_div(-20, 6, -2, i, 2'b10, 0);
|
||||
test_div( 20, -6, 2, i, 2'b10, 0);
|
||||
test_div(-20, -6, -2, i, 2'b10, 0);
|
||||
|
||||
test_div(-1<<31, 1, 0, i, 2'b10, 0);
|
||||
test_div(-1<<31, -1, 0, i, 2'b10, 0);
|
||||
|
||||
test_div(-1<<31, 0, -1<<31, i, 2'b10, 0);
|
||||
test_div( 1, 0, 1, i, 2'b10, 0);
|
||||
test_div( 0, 0, 0, i, 2'b10, 0);
|
||||
|
||||
//remu test
|
||||
test_div( 20, 6, 2, i, 2'b11, 0);
|
||||
test_div(-20, 6, 2, i, 2'b11, 0);
|
||||
test_div( 20, -6, 20, i, 2'b11, 0);
|
||||
test_div(-20, -6, -20, i, 2'b11, 0);
|
||||
|
||||
test_div(-1<<31, 1, 0, i, 2'b11, 0);
|
||||
test_div(-1<<31, -1, -1<<31, i, 2'b11, 0);
|
||||
|
||||
test_div(-1<<31, 0, -1<<31, i, 2'b11, 0);
|
||||
test_div( 1, 0, 1, i, 2'b11, 0);
|
||||
test_div( 0, 0, 0, i, 2'b11, 0);
|
||||
|
||||
//reuse result tests
|
||||
test_div(20, 6, 2, i, 2'b11, 0);
|
||||
test_div(20, 6, 2, i, 2'b10, 1);
|
||||
test_div(20, 6, 3, i, 2'b00, 1);
|
||||
|
||||
test_div(200, 200, 1, i, 2'b01, 0);
|
||||
test_div(200, 200, 1, i, 2'b00, 1);
|
||||
end
|
||||
|
||||
wait (result_queue.size() == 0);
|
||||
//wait (latency_queue.size() == 0);
|
||||
#200;
|
||||
if (result_queue.size() == 0) begin
|
||||
// $display("queue size: %d", result_queue.size());
|
||||
|
||||
case(DIV_ALGORITHM)
|
||||
RADIX_2 : $display("RADIX_2");
|
||||
RADIX_2_EARLY_TERMINATE : $display("RADIX_2_EARLY_TERMINATE");
|
||||
RADIX_2_EARLY_TERMINATE_FULL : $display("RADIX_2_EARLY_TERMINATE_FULL");
|
||||
RADIX_4 : $display("RADIX_4");
|
||||
RADIX_4_EARLY_TERMINATE : $display("RADIX_4_EARLY_TERMINATE");
|
||||
RADIX_8 : $display("RADIX_8");
|
||||
RADIX_8_EARLY_TERMINATE : $display("RADIX_8_EARLY_TERMINATE");
|
||||
RADIX_16 : $display("RADIX_16");
|
||||
QUICK_NAIVE : $display("QUICK_NAIVE");
|
||||
QUICK_CLZ : $display("QUICK_CLZ");
|
||||
QUICK_CLZ_MK2 : $display("QUICK_CLZ_MK2");
|
||||
QUICK_RADIX_4 : $display("QUCIK_RADIX_4");
|
||||
default : $error("invalid div selection");
|
||||
endcase
|
||||
$display("Div Unit Test -------------------- Passed");
|
||||
end
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
|
@ -1,289 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2017 Eric Matthews, Lesley Shannon
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Initial code developed under the supervision of Dr. Lesley Shannon,
|
||||
* Reconfigurable Computing Lab, Simon Fraser University.
|
||||
*
|
||||
* Author(s):
|
||||
* Alec Lu <fla30@sfu.ca>
|
||||
* Eric Matthews <ematthew@sfu.ca>
|
||||
*/
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
import cva5_config::*;
|
||||
import cva5_types::*;
|
||||
|
||||
typedef struct packed{
|
||||
mul_inputs_t module_input;
|
||||
logic [31: 0] expected_result;
|
||||
} mul_result_t;
|
||||
|
||||
module mul_unit_tb();
|
||||
//DUT Regs and Wires
|
||||
logic clk;
|
||||
logic rst;
|
||||
func_unit_ex_interface mul_ex();
|
||||
unit_writeback_interface mul_wb();
|
||||
mul_inputs_t mul_inputs;
|
||||
|
||||
//Internal Regs and Wires
|
||||
integer test_number;
|
||||
//Input
|
||||
int rs1_rand;
|
||||
int rs2_rand;
|
||||
int unsigned rs1_urand;
|
||||
int unsigned rs2_urand;
|
||||
longint signedMulResult;
|
||||
longint unsigned unsignedMulResult;
|
||||
logic [31: 0] result_rand;
|
||||
logic [ 1: 0] op_rand;
|
||||
//Result
|
||||
mul_result_t result_queue[$];
|
||||
mul_result_t temp_result;
|
||||
//Latency
|
||||
parameter MAX_RESPONSE_LATENCY = 32'hF;
|
||||
logic wb_done;
|
||||
logic firstPop;
|
||||
logic [31: 0] latency_queue[$];
|
||||
logic [31: 0] wb_done_acc;
|
||||
logic [31: 0] response_latency;
|
||||
|
||||
//DUT
|
||||
mul_unit uut (.*);
|
||||
|
||||
//Reset
|
||||
task reset;
|
||||
begin
|
||||
rst = 1'b1;
|
||||
#100 rst = 1'b0;
|
||||
end
|
||||
endtask
|
||||
|
||||
//Clock Gen
|
||||
always
|
||||
#1 clk = ~clk;
|
||||
|
||||
//Latency Logic
|
||||
function int genRandLatency();
|
||||
genRandLatency = $random & MAX_RESPONSE_LATENCY;
|
||||
endfunction
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst) begin
|
||||
wb_done_acc <= 32'h1;
|
||||
firstPop <= 1'b1;
|
||||
response_latency <= 32'hFFFFFFFF;
|
||||
end else begin
|
||||
if (mul_wb.done_next_cycle) begin
|
||||
wb_done_acc <= wb_done_acc + 1;
|
||||
end else begin
|
||||
wb_done_acc <= 32'h1;
|
||||
end
|
||||
|
||||
if (firstPop | mul_wb.accepted) begin
|
||||
response_latency <= latency_queue.pop_front();
|
||||
firstPop <= 1'b0;
|
||||
end else begin
|
||||
response_latency <= response_latency;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign wb_done = mul_wb.done_next_cycle & (wb_done_acc >= response_latency);
|
||||
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst)
|
||||
mul_wb.accepted <= 0;
|
||||
else
|
||||
mul_wb.accepted <= wb_done;
|
||||
end
|
||||
|
||||
//Output checker
|
||||
always_ff @(posedge clk) begin
|
||||
if (rst)
|
||||
test_number <= 1;
|
||||
if (mul_wb.accepted) begin
|
||||
test_number <= test_number + 1;
|
||||
temp_result = result_queue.pop_front();
|
||||
if (temp_result.expected_result != 32'hxxxxxxxx) begin
|
||||
assert (mul_wb.rd == temp_result.expected_result)
|
||||
else $error("Incorrect result on test number %d. (%h, should be: %h)\n\t Input: rs1: %d, rs2: %d, op: %b",
|
||||
test_number, mul_wb.rd, temp_result.expected_result,
|
||||
temp_result.module_input.rs1, temp_result.module_input.rs2,
|
||||
temp_result.module_input.op);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//Driver
|
||||
task test_div (input logic [XLEN-1:0] a, b, result, latency, logic[1:0] op);
|
||||
wait (~clk & mul_ex.ready);
|
||||
mul_inputs.rs1 = a;
|
||||
mul_inputs.rs2 = b;
|
||||
mul_inputs.op = op;
|
||||
result_queue.push_back({mul_inputs, result});
|
||||
latency_queue.push_back(latency);
|
||||
mul_ex.new_request_dec = 1; #2
|
||||
mul_ex.new_request_dec = 0;
|
||||
endtask
|
||||
|
||||
//Generator + Transaction
|
||||
task test_gen();
|
||||
op_rand = $urandom % 4;
|
||||
rs1_rand = $random;
|
||||
rs2_rand = $random;
|
||||
|
||||
//SW model
|
||||
case (op_rand)
|
||||
2'b00:begin //MUL
|
||||
signedMulResult = rs1_rand * rs2_rand;
|
||||
result_rand = signedMulResult[31: 0];
|
||||
end
|
||||
2'b01:begin //MULH
|
||||
signedMulResult = rs1_rand * rs2_rand;
|
||||
result_rand = signedMulResult[63:32];
|
||||
end
|
||||
2'b10:begin //MULHSU - rs1(signed) & rs2(unsigned)
|
||||
if (rs1_rand[31]) begin
|
||||
rs1_urand = rs1_rand * -1;
|
||||
rs2_urand = rs2_rand;
|
||||
unsignedMulResult = rs1_urand * rs2_urand;
|
||||
signedMulResult = unsignedMulResult;
|
||||
signedMulResult = signedMulResult * -1;
|
||||
result_rand = signedMulResult[63:32];
|
||||
end else begin
|
||||
rs1_urand = rs1_rand;
|
||||
rs2_urand = rs2_rand;
|
||||
unsignedMulResult = rs1_urand * rs2_urand;
|
||||
result_rand = unsignedMulResult[63:32];
|
||||
end
|
||||
end
|
||||
2'b11:begin //MULHU
|
||||
rs1_urand = rs1_rand;
|
||||
rs2_urand = rs2_rand;
|
||||
unsignedMulResult = rs1_urand * rs2_urand;
|
||||
result_rand = unsignedMulResult[63:32];
|
||||
end
|
||||
endcase
|
||||
|
||||
test_div (rs1_rand, rs2_rand, result_rand, genRandLatency(), op_rand);
|
||||
endtask
|
||||
|
||||
initial
|
||||
begin
|
||||
clk = 0;
|
||||
rst = 1;
|
||||
mul_inputs.rs1 = 0;
|
||||
mul_inputs.rs2 = 0;
|
||||
mul_inputs.op = 0;
|
||||
mul_ex.new_request_dec = 0;
|
||||
mul_wb.accepted = 0;
|
||||
|
||||
reset();
|
||||
|
||||
//Randomized Test (operation + latency)
|
||||
for (int i=0; i < 1000; i = i+1) begin
|
||||
test_gen();
|
||||
end
|
||||
|
||||
for (int i=0; i < 6; i = i+5) begin
|
||||
//MUL
|
||||
test_div (32'h00007e00, 32'hb6db6db7, 32'h00001200, i, 2'b00);
|
||||
test_div (32'h00007fc0, 32'hb6db6db7, 32'h00001240, i, 2'b00);
|
||||
|
||||
test_div (32'h00000000, 32'h00000000, 32'h00000000, i, 2'b00);
|
||||
test_div (32'h00000001, 32'h00000001, 32'h00000001, i, 2'b00);
|
||||
test_div (32'h00000003, 32'h00000007, 32'h00000015, i, 2'b00);
|
||||
|
||||
test_div (32'hffff8000, 32'h00000000, 32'h00000000, i, 2'b00);
|
||||
test_div (32'h00000000, 32'h80000000, 32'h00000000, i, 2'b00);
|
||||
test_div (32'hffff8000, 32'h80000000, 32'h00000000, i, 2'b00);
|
||||
|
||||
test_div (32'haaaaaaab, 32'h0002fe7d, 32'h0000ff7f, i, 2'b00);
|
||||
test_div (32'h0002fe7d, 32'haaaaaaab, 32'h0000ff7f, i, 2'b00);
|
||||
|
||||
test_div (32'hff000000, 32'hff000000, 32'h00000000, i, 2'b00);
|
||||
|
||||
test_div (32'hffffffff, 32'hffffffff, 32'h00000001, i, 2'b00);
|
||||
test_div (32'h00000001, 32'hffffffff, 32'hffffffff, i, 2'b00);
|
||||
test_div (32'hffffffff, 32'h00000001, 32'hffffffff, i, 2'b00);
|
||||
|
||||
//MULH
|
||||
test_div (32'h00000000, 32'h00000000, 32'h00000000, i, 2'b01);
|
||||
test_div (32'h00000001, 32'h00000001, 32'h00000000, i, 2'b01);
|
||||
test_div (32'h00000003, 32'h00000007, 32'h00000000, i, 2'b01);
|
||||
|
||||
test_div (32'h00000000, 32'hffff8000, 32'h00000000, i, 2'b01);
|
||||
test_div (32'h80000000, 32'h00000000, 32'h00000000, i, 2'b01);
|
||||
test_div (32'h80000000, 32'h00000000, 32'h00000000, i, 2'b01);
|
||||
|
||||
test_div (32'haaaaaaab, 32'h0002fe7d, 32'hffff0081, i, 2'b01);
|
||||
test_div (32'h0002fe7d, 32'haaaaaaab, 32'hffff0081, i, 2'b01);
|
||||
|
||||
test_div (32'hff000000, 32'hff000000, 32'h00010000, i, 2'b01);
|
||||
|
||||
test_div (32'hffffffff, 32'hffffffff, 32'h00000000, i, 2'b01);
|
||||
test_div (32'hffffffff, 32'h00000001, 32'hffffffff, i, 2'b01);
|
||||
test_div (32'h00000001, 32'hffffffff, 32'hffffffff, i, 2'b01);
|
||||
|
||||
//MULHSU - rs1(signed) & rs2(unsigned)
|
||||
test_div (32'h00000000, 32'h00000000, 32'h00000000, i, 2'b10);
|
||||
test_div (32'h00000001, 32'h00000001, 32'h00000000, i, 2'b10);
|
||||
test_div (32'h00000007, 32'h00000003, 32'h00000000, i, 2'b10);
|
||||
|
||||
test_div (32'hffff8000, 32'h00000000, 32'h00000000, i, 2'b10);
|
||||
test_div (32'h00000000, 32'h80000000, 32'h00000000, i, 2'b10);
|
||||
test_div (32'h80000000, 32'hffff8000, 32'h80004000, i, 2'b10);
|
||||
|
||||
test_div (32'haaaaaaab, 32'h0002fe7d, 32'hffff0081, i, 2'b10);
|
||||
test_div (32'h0002fe7d, 32'haaaaaaab, 32'h0001fefe, i, 2'b10);
|
||||
|
||||
test_div (32'hff000000, 32'hff000000, 32'hff010000, i, 2'b10);
|
||||
|
||||
test_div (32'hffffffff, 32'hffffffff, 32'hffffffff, i, 2'b10);
|
||||
test_div (32'hffffffff, 32'h00000001, 32'hffffffff, i, 2'b10);
|
||||
test_div (32'h00000001, 32'hffffffff, 32'h00000000, i, 2'b10);
|
||||
|
||||
//MULHU
|
||||
test_div (32'h00000000, 32'h00000000, 32'h00000000, i, 2'b11);
|
||||
test_div (32'h00000001, 32'h00000001, 32'h00000000, i, 2'b11);
|
||||
test_div (32'h00000003, 32'h00000007, 32'h00000000, i, 2'b11);
|
||||
|
||||
test_div (32'hffff8000, 32'h00000000, 32'h00000000, i, 2'b11);
|
||||
test_div (32'h80000000, 32'h00000000, 32'h00000000, i, 2'b11);
|
||||
test_div (32'h80000000, 32'hffff8000, 32'h7fffc000, i, 2'b11);
|
||||
|
||||
test_div (32'haaaaaaab, 32'h0002fe7d, 32'h0001fefe, i, 2'b11);
|
||||
test_div (32'h0002fe7d, 32'haaaaaaab, 32'h0001fefe, i, 2'b11);
|
||||
|
||||
test_div (32'hff000000, 32'hff000000, 32'hfe010000, i, 2'b11);
|
||||
|
||||
test_div (32'hffffffff, 32'hffffffff, 32'hfffffffe, i, 2'b11);
|
||||
test_div (32'hffffffff, 32'h00000001, 32'h00000000, i, 2'b11);
|
||||
test_div (32'h00000001, 32'hffffffff, 32'h00000000, i, 2'b11);
|
||||
end
|
||||
|
||||
wait (result_queue.size() == 0);
|
||||
wait (latency_queue.size() == 0);
|
||||
#200;
|
||||
if (result_queue.size() == 0) begin
|
||||
// $display("queue size: %d", result_queue.size());
|
||||
$display("Mul Unit Test -------------------- Passed");
|
||||
end
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
3
tools/.gitignore
vendored
3
tools/.gitignore
vendored
|
@ -1,3 +0,0 @@
|
|||
*.log
|
||||
*.hw_init
|
||||
*.sim_init
|
Loading…
Add table
Add a link
Reference in a new issue