1
0
mirror of https://github.com/aolofsson/oh.git synced 2025-01-30 02:32:53 +08:00

Adding manual test feature to testbench

-This is as far as I go with fufu testing (random next)
-Add basic test for cleaning up reads/writes
-104 bit packet format for driving transactions, very useful
This commit is contained in:
Andreas Olofsson 2015-04-18 16:14:53 -04:00
parent 8adc060bc8
commit 643ceed432
3 changed files with 76 additions and 36 deletions

View File

@ -175,8 +175,8 @@ module dv_elink(/*AUTOARG*/
//Clocks
wire clkin = clk[0];
wire m_axi_aclk = clk[1];
wire clkin = clk[0]; //for pll-->cclk, rxclk, txclk
wire m_axi_aclk = clk[1];
wire s_axi_aclk = clk[1];
//Splitting transaction into read/write path
@ -366,7 +366,7 @@ module dv_elink(/*AUTOARG*/
.s_axi_rvalid (elink_axi_rvalid), // Templated
.s_axi_wready (elink_axi_wready), // Templated
// Inputs
.s_axi_araddr (elink_axi_araddr[29:0]), // Templated
.s_axi_araddr (elink_axi_araddr[31:0]), // Templated
.s_axi_arburst (elink_axi_arburst[1:0]), // Templated
.s_axi_arcache (elink_axi_arcache[3:0]), // Templated
.s_axi_arlen (elink_axi_arlen[7:0]), // Templated
@ -374,7 +374,7 @@ module dv_elink(/*AUTOARG*/
.s_axi_arqos (elink_axi_arqos[3:0]), // Templated
.s_axi_arsize (elink_axi_arsize[2:0]), // Templated
.s_axi_arvalid (elink_axi_arvalid), // Templated
.s_axi_awaddr (elink_axi_awaddr[29:0]), // Templated
.s_axi_awaddr (elink_axi_awaddr[31:0]), // Templated
.s_axi_awburst (elink_axi_awburst[1:0]), // Templated
.s_axi_awcache (elink_axi_awcache[3:0]), // Templated
.s_axi_awlen (elink_axi_awlen[7:0]), // Templated
@ -402,6 +402,8 @@ module dv_elink(/*AUTOARG*/
);
*/
defparam elink.ELINKID = 12'h800;
elink elink (.hard_reset (reset),
.embox_not_empty (embox_full),
.embox_full (embox_not_empty),
@ -415,7 +417,7 @@ module dv_elink(/*AUTOARG*/
.cclk_p (cclk_p),
.cclk_n (cclk_n),
.clkin (clkin),
.bypass_clocks ({clkin,clkin,clkin}),
.clkbypass ({clkin,clkin,clkin}),
/*AUTOINST*/
// Outputs
.rxo_wr_wait_p (wr_wait_p), // Templated
@ -479,7 +481,7 @@ module dv_elink(/*AUTOARG*/
.m_axi_rresp (elink_axi_rresp[1:0]), // Templated
.m_axi_rvalid (elink_axi_rvalid), // Templated
.m_axi_wready (elink_axi_wready), // Templated
.s_axi_araddr (dv_axi_araddr[29:0]), // Templated
.s_axi_araddr (dv_axi_araddr[31:0]), // Templated
.s_axi_arburst (dv_axi_arburst[1:0]), // Templated
.s_axi_arcache (dv_axi_arcache[3:0]), // Templated
.s_axi_arlen (dv_axi_arlen[7:0]), // Templated
@ -487,7 +489,7 @@ module dv_elink(/*AUTOARG*/
.s_axi_arqos (dv_axi_arqos[3:0]), // Templated
.s_axi_arsize (dv_axi_arsize[2:0]), // Templated
.s_axi_arvalid (dv_axi_arvalid), // Templated
.s_axi_awaddr (dv_axi_awaddr[29:0]), // Templated
.s_axi_awaddr (dv_axi_awaddr[31:0]), // Templated
.s_axi_awburst (dv_axi_awburst[1:0]), // Templated
.s_axi_awcache (dv_axi_awcache[3:0]), // Templated
.s_axi_awlen (dv_axi_awlen[7:0]), // Templated
@ -527,9 +529,9 @@ module dv_elink(/*AUTOARG*/
emesh_monitor #(.NAME("stimulus")) ext_monitor (.emesh_wait ((dut_rd_wait | dut_wr_wait)),//TODO:fix collisions
.clk (m_axi_aclk),
/*AUTOINST*/
// Inputs
.clk (m_axi_aclk),
.reset (reset),
.itrace (itrace),
.etime (etime[31:0]),
@ -542,9 +544,9 @@ module dv_elink(/*AUTOARG*/
.emesh_srcaddr (ext_srcaddr[AW-1:0])); // Templated
emesh_monitor #(.NAME("dut")) dut_monitor (.emesh_wait (1'b0),
.clk (s_axi_aclk),
/*AUTOINST*/
// Inputs
.clk (s_axi_aclk),
.reset (reset),
.itrace (itrace),
.etime (etime[31:0]),

View File

@ -1,7 +1,13 @@
module dv_elink_tb();
parameter AW=32;
parameter DW=32;
parameter CW=2; //number of clocks to send int
parameter CW=2; //number of clocks to send int
parameter MW=104;
parameter MAW=10;
parameter MD=1<<MAW;//limit test to 1K transactions
//TODO:generealize
/* verilator lint_off STMTDLY */
/* verilator lint_off UNOPTFLAT */
//REGS
@ -19,18 +25,32 @@ module dv_elink_tb();
reg ext_wr_wait;
reg ext_rd_wait;
reg init;
reg [MW-1:0] stimarray[MD-1:0];
reg [MW-1:0] transaction;
reg [MAW-1:0] stim_addr;
integer i;
`ifdef MANUAL
//TODO: make test name a parameter, fancify,...
initial
begin
for(i=0;i<MD;i++)
stimarray[i]='d0;
//$readmemh(`TESTNAME,stimarray,0,`TRANS-1);//How to?
$readmemh("test.memh",stimarray,0,`TRANS-1);
end
`endif
//Forever clock
always
#10 clk[0] = ~clk[0];//clock for elink
#1 clk[0] = ~clk[0];//clock for elink
always
#100 clk[1] = ~clk[1];//clock for axi interface
#10 clk[1] = ~clk[1];//clock for axi interface
//should make variable to really test all fifos
wire clkstim = clk[1];
//Reset
initial
begin
@ -40,22 +60,22 @@ module dv_elink_tb();
clk[1:0] = 2'b0;
datamode = 2'b10;
#400
`ifdef AUTO
//clock config (fast /2)
dv_elink.elink.ecfg.ecfg_clk_reg[15:0] = 16'h0113;
//tx config (enable)
dv_elink.elink.ecfg.ecfg_tx_reg[8:0] = 9'h001;
//rx config (enable)
dv_elink.elink.ecfg.ecfg_rx_reg[4:0] = 5'h01;
`endif
reset = 1'b0; // at time 100 release reset
#1000
go = 1'b1;
#2000
datamode = 2'b01;
#3000
datamode = 2'b00;
#4000
`ifdef AUTO
go = 1'b0;
`endif
#10000
$finish;
end
@ -67,24 +87,38 @@ module dv_elink_tb();
always @ (posedge clkstim)
if(reset | ~go)
begin
ext_access <= 1'b0; //empty
ext_write <= 1'b1;
ext_datamode[1:0] <= 2'b0;
ext_ctrlmode[3:0] <= 4'b0;
ext_data[31:0] <= 32'b0;
ext_dstaddr[31:0] <= 32'b0;
ext_srcaddr[31:0] <= 32'b0;
ext_rd_wait <= 1'b0;
ext_wr_wait <= 1'b0;
ext_access <= 1'b0; //empty
ext_write <= 1'b0;
ext_datamode[1:0] <= 2'b0;
ext_ctrlmode[3:0] <= 4'b0;
ext_data[31:0] <= 32'b0;
ext_dstaddr[31:0] <= 32'b0;
ext_srcaddr[31:0] <= 32'b0;
ext_rd_wait <= 1'b0;
ext_wr_wait <= 1'b0;
stim_addr[MAW-1:0] <= 'd0;
transaction[MW-1:0] <= 'd0;
end
else if (go & ~dut_wr_wait)
//else if ((go & ~ext_access) | (go & ext_access & ~dut_wr_wait))
begin
ext_access <= 1'b1;
ext_data[31:0] <= ext_data[31:0] + 32'b1;
ext_dstaddr[31:0] <= ext_dstaddr[31:0] + 32'd8;//(32'b1<<datamode)
ext_datamode[1:0] <= datamode[1:0];
end
`ifdef MANUAL
transaction[MW-1:0] <= stimarray[stim_addr];
ext_access <= transaction[0];
ext_write <= transaction[1];
ext_datamode[1:0] <= transaction[3:2];
ext_ctrlmode[3:0] <= transaction[7:4];
ext_dstaddr[31:0] <= transaction[39:8];
ext_data[31:0] <= transaction[71:40];
ext_srcaddr[31:0] <= transaction[103:72];
stim_addr[MAW-1:0] <= stim_addr[MAW-1:0] + 1'b1;
`else
ext_access <= 1'b1;
ext_data[31:0] <= ext_data[31:0] + 32'b1;
ext_dstaddr[31:0] <= ext_dstaddr[31:0] + 32'd8;//(32'b1<<datamode)
ext_datamode[1:0] <= datamode[1:0];
`endif
end
//Waveform dump
`ifndef TARGET_VERILATOR
initial

View File

@ -1,10 +1,14 @@
#!/bin/bash
#Linting in Verilator
verilator --lint-only -F elink.cmd -DTARGET_VERILATOR
#verilator --lint-only -F elink.cmd -DTARGET_VERILATOR
#Compiling sim
iverilog -f elink.cmd
#a sorry hack, too tired to get it right, please fix...
TRANS=$(wc -l test.memh)
TRANS=${TRANS:0:3}
#RANDOM TEST
iverilog -f elink.cmd -DMANUAL -DTRANS=$TRANS -DTESTNAME=test.memh
#iverilog -f elink.cmd -DAUTO
#Running sim
./a.out