82169e971e
Until now, the number of L1 client channels was set statically in the configuration. This static configuration also assumed the same number of cached and uncached channels per tile. As we plan to move towards heterogenous multicore systems, this restriction should be removed. This commit changes the generator so that number of channels per tile can be independently set (using cde.Parameters.alterPartial). The OuterMemorySystem will dynamically compute the number of cached and uncached channels by summing the number of each kind of channel per core.
192 lines
4.5 KiB
Verilog
192 lines
4.5 KiB
Verilog
// See LICENSE for license details.
|
|
|
|
extern "A" void htif_fini(input reg failure);
|
|
|
|
extern "A" void htif_tick
|
|
(
|
|
output reg htif_in_valid,
|
|
input reg htif_in_ready,
|
|
output reg [`HTIF_WIDTH-1:0] htif_in_bits,
|
|
|
|
input reg htif_out_valid,
|
|
output reg htif_out_ready,
|
|
input reg [`HTIF_WIDTH-1:0] htif_out_bits,
|
|
|
|
output reg [31:0] exit
|
|
);
|
|
|
|
extern "A" void memory_tick
|
|
(
|
|
input reg [31:0] channel,
|
|
|
|
input reg ar_valid,
|
|
output reg ar_ready,
|
|
input reg [`MEM_ADDR_BITS-1:0] ar_addr,
|
|
input reg [`MEM_ID_BITS-1:0] ar_id,
|
|
input reg [2:0] ar_size,
|
|
input reg [7:0] ar_len,
|
|
|
|
input reg aw_valid,
|
|
output reg aw_ready,
|
|
input reg [`MEM_ADDR_BITS-1:0] aw_addr,
|
|
input reg [`MEM_ID_BITS-1:0] aw_id,
|
|
input reg [2:0] aw_size,
|
|
input reg [7:0] aw_len,
|
|
|
|
input reg w_valid,
|
|
output reg w_ready,
|
|
input reg [`MEM_STRB_BITS-1:0] w_strb,
|
|
input reg [`MEM_DATA_BITS-1:0] w_data,
|
|
input reg w_last,
|
|
|
|
output reg r_valid,
|
|
input reg r_ready,
|
|
output reg [1:0] r_resp,
|
|
output reg [`MEM_ID_BITS-1:0] r_id,
|
|
output reg [`MEM_DATA_BITS-1:0] r_data,
|
|
output reg r_last,
|
|
|
|
output reg b_valid,
|
|
input reg b_ready,
|
|
output reg [1:0] b_resp,
|
|
output reg [`MEM_ID_BITS-1:0] b_id
|
|
);
|
|
|
|
module rocketTestHarness;
|
|
|
|
reg [31:0] seed;
|
|
initial seed = $get_initial_random_seed();
|
|
|
|
//-----------------------------------------------
|
|
// Instantiate the processor
|
|
|
|
reg clk = 1'b0;
|
|
reg reset = 1'b1;
|
|
reg r_reset = 1'b1;
|
|
reg start = 1'b0;
|
|
|
|
always #`CLOCK_PERIOD clk = ~clk;
|
|
|
|
reg [ 31:0] n_mem_channel = `N_MEM_CHANNELS;
|
|
reg [ 31:0] htif_width = `HTIF_WIDTH;
|
|
reg [ 31:0] mem_width = `MEM_DATA_BITS;
|
|
reg [ 63:0] max_cycles = 0;
|
|
reg [ 63:0] trace_count = 0;
|
|
reg [1023:0] loadmem = 0;
|
|
reg [1023:0] vcdplusfile = 0;
|
|
reg [1023:0] vcdfile = 0;
|
|
reg verbose = 0;
|
|
wire printf_cond = verbose && !reset;
|
|
integer stderr = 32'h80000002;
|
|
|
|
`include `TBVFRAG
|
|
|
|
always @(posedge clk)
|
|
begin
|
|
r_reset <= reset;
|
|
end
|
|
|
|
reg htif_in_valid_premux;
|
|
reg [`HTIF_WIDTH-1:0] htif_in_bits_premux;
|
|
assign htif_in_bits = htif_in_bits_premux;
|
|
assign htif_in_valid = htif_in_valid_premux;
|
|
wire htif_in_ready_premux = htif_in_ready;
|
|
reg [31:0] exit = 0;
|
|
|
|
always @(posedge htif_clk)
|
|
begin
|
|
if (reset || r_reset)
|
|
begin
|
|
htif_in_valid_premux <= 0;
|
|
htif_out_ready <= 0;
|
|
exit <= 0;
|
|
end
|
|
else
|
|
begin
|
|
htif_tick
|
|
(
|
|
htif_in_valid_premux,
|
|
htif_in_ready_premux,
|
|
htif_in_bits_premux,
|
|
htif_out_valid,
|
|
htif_out_ready,
|
|
htif_out_bits,
|
|
exit
|
|
);
|
|
end
|
|
end
|
|
|
|
//-----------------------------------------------
|
|
// Start the simulation
|
|
|
|
// Read input arguments and initialize
|
|
initial
|
|
begin
|
|
$value$plusargs("max-cycles=%d", max_cycles);
|
|
`ifdef MEM_BACKUP_EN
|
|
$value$plusargs("loadmem=%s", loadmem);
|
|
if (loadmem)
|
|
$readmemh(loadmem, mem.ram);
|
|
`endif
|
|
verbose = $test$plusargs("verbose");
|
|
`ifdef DEBUG
|
|
if ($value$plusargs("vcdplusfile=%s", vcdplusfile))
|
|
begin
|
|
$vcdplusfile(vcdplusfile);
|
|
$vcdpluson(0);
|
|
$vcdplusmemon(0);
|
|
end
|
|
|
|
if ($value$plusargs("vcdfile=%s", vcdfile))
|
|
begin
|
|
$dumpfile(vcdfile);
|
|
$dumpvars(0, dut);
|
|
$dumpon;
|
|
end
|
|
`define VCDPLUSCLOSE $vcdplusclose; $dumpoff;
|
|
`else
|
|
`define VCDPLUSCLOSE
|
|
`endif
|
|
|
|
// Strobe reset
|
|
#777.7 reset = 0;
|
|
|
|
end
|
|
|
|
reg [255:0] reason = 0;
|
|
always @(posedge clk)
|
|
begin
|
|
if (max_cycles > 0 && trace_count > max_cycles)
|
|
reason = "timeout";
|
|
if (exit > 1)
|
|
$sformat(reason, "tohost = %d", exit >> 1);
|
|
|
|
if (reason)
|
|
begin
|
|
$fdisplay(stderr, "*** FAILED *** (%s) after %d simulation cycles", reason, trace_count);
|
|
`VCDPLUSCLOSE
|
|
htif_fini(1'b1);
|
|
end
|
|
|
|
if (exit == 1)
|
|
begin
|
|
if (verbose)
|
|
$fdisplay(stderr, "Completed after %d simulation cycles", trace_count);
|
|
`VCDPLUSCLOSE
|
|
htif_fini(1'b0);
|
|
end
|
|
end
|
|
|
|
always @(posedge clk)
|
|
begin
|
|
trace_count = trace_count + 1;
|
|
`ifdef GATE_LEVEL
|
|
if (verbose)
|
|
begin
|
|
$fdisplay(stderr, "C: %10d", trace_count-1);
|
|
end
|
|
`endif
|
|
end
|
|
|
|
endmodule
|