1
0
mirror of https://github.com/aolofsson/oh.git synced 2025-01-17 20:02:53 +08:00
oh/stdlib/testbench/dv_driver.v
Andreas.Olofsson 19f278ddb3 Changing name dv to testbench
-Clarity...
2022-06-22 11:12:51 -04:00

152 lines
4.0 KiB
Verilog

/* verilator lint_off STMTDLY */
module dv_driver #( parameter N = 1, // "N" packets wide
parameter AW = 32, // address width
parameter PW = 104, // packet width (derived)
parameter IDW = 12, // id width
parameter NAME = "none", // north, south etc
parameter STIMS = 1, // number of stimulus
parameter MAW = 16 // 64KB memory address width
)
(
//control signals
input clkin,
input clkout,
input nreset,
input start, //starts test
input [IDW-1:0] coreid, //everything has a coreid!
//inputs for monitoring
input [N-1:0] dut_access,
input [N*PW-1:0] dut_packet,
input [N-1:0] dut_wait,
//stimulus to drive
output [N-1:0] stim_access,
output [N*PW-1:0] stim_packet,
output [N-1:0] stim_wait,
output stim_done
);
//#############
//LOCAL WIRES
//#############
reg [IDW-1:0] offset;
wire [N*32-1:0] stim_count;
wire [N-1:0] stim_vec_done;
wire [N*IDW-1:0] coreid_array;
wire [N*PW-1:0] mem_packet_out;
wire [N-1:0] mem_access_out;
wire [N-1:0] mem_wait_out;
/*AUTOWIRE*/
//###########################################
//STIMULUS
//###########################################
assign stim_done = &(stim_vec_done[N-1:0]);
genvar i;
generate
for(i=0;i<N;i=i+1) begin : stim
if(i<STIMS) begin
stimulus #(.PW(PW),
.INDEX(i),
.NAME(NAME))
stimulus (// Outputs
.stim_access (stim_access[0]),
.stim_packet (stim_packet[(i+1)*PW-1:i*PW]),
.stim_count (stim_count[(i+1)*32-1:i*32]),
.stim_done (stim_vec_done[i]),
.stim_wait (stim_wait[i]),
// Inputs
.clk (clkin),
.nreset (nreset),
.start (start),
.dut_wait (dut_wait[i])
);
end // if (i<STIMS)
else
begin
assign stim_access[i] = 'b0;
assign stim_packet[(i+1)*PW-1:i*PW] = 'b0;
assign stim_count[(i+1)*32-1:i*32] = 'b0;
assign stim_vec_done[i] = 'b1;
assign stim_wait[i] = 'b0;
end
end // block: stim
endgenerate
//###########################################
//MONITORS (USE CLK2)
//###########################################
//Increment coreID depending on counter and orientation of side block
//TODO: parametrize
initial
begin
if(NAME=="north" | NAME=="south" )
offset=12'h001;
else
offset=12'h040;
end
genvar j;
generate
for(j=0;j<N;j=j+1) begin : mon
assign coreid_array[(j+1)*IDW-1:j*IDW] = coreid[IDW-1:0] + j*offset;
//MONITOR
emesh_monitor #(.PW(PW),
.NAME(NAME),
.IDW(IDW)
)
monitor (//inputs
.clk (clkout),
.nreset (nreset),
.dut_access (dut_access[j]),
.dut_packet (dut_packet[(j+1)*PW-1:j*PW]),
.coreid (coreid_array[(j+1)*IDW-1:j*IDW]),
.wait_in (stim_wait[j])
);
end // for (i=0;i<N;i=i+1)
endgenerate
//###########################################
//MEMORY
//###########################################
genvar k;
generate
for(j=0;j<N;j=j+1) begin : mem
ememory #(.NAME(NAME),
.IDW(IDW),
.PW(PW),
.AW(AW)
)
ememory(// Outputs
.wait_out (mem_wait_out[j]),
.access_out (mem_access_out[j]),
.packet_out (mem_packet_out[(j+1)*PW-1:j*PW]),
// Inputs
.clk (clkout),
.nreset (nreset),
.coreid (coreid[IDW-1:0]),
.access_in (dut_access[j]),
.packet_in (dut_packet[(j+1)*PW-1:j*PW]),
.wait_in (dut_wait[j])
);
end
endgenerate
//###########################################
//MUX BETWEEN STIMULUS AND MEMORY
//###########################################
//stimulus has higher priority
//TODO: Implement
endmodule // dv_driver
// Local Variables:
// verilog-library-directories:("." "../../emesh/hdl")
// End: