rx_test_harness.v
来自「altera fpga 和ts201的linkport接口设计」· Verilog 代码 · 共 245 行
V
245 行
// ================================================================================
// (c) 2003 Altera Corporation. All rights reserved.
// Altera products are protected under numerous U.S. and foreign patents, maskwork
// rights, copyrights and other intellectual property laws.
//
// This reference design file, and your use thereof, is subject to and governed
// by the terms and conditions of the applicable Altera Reference Design License
// Agreement (either as signed by you, agreed by you upon download or as a
// "click-through" agreement upon installation andor found at www.altera.com).
// By using this reference design file, you indicate your acceptance of such terms
// and conditions between you and Altera Corporation. In the event that you do
// not agree with such terms and conditions, you may not use the reference design
// file and please promptly destroy any copies you have made.
//
// This reference design file is being provided on an "as-is" basis and as an
// accommodation and therefore all warranties, representations or guarantees of
// any kind (whether express, implied or statutory) including, without limitation,
// warranties of merchantability, non-infringement, or fitness for a particular
// purpose, are specifically disclaimed. By making this reference design file
// available, Altera expressly does not recommend, suggest or require that this
// reference design file be used in combination with any other product not
// provided by Altera.
// ================================================================================
//---------------------------------------------------------------------------
// Test harness for ADI link port
//---------------------------------------------------------------------------
`timescale 1ps/1ps
module rx_tb ();
reg clk;
reg rst_n;
reg [3:0] lp_data;
wire lp_clk;
reg rvere;
reg rdreq;
wire empty;
wire [32:0] rdata;
wire acko;
reg bcmpi_n;
integer seed;
integer i;
reg lp_clk_src;
reg [3:0] lp_data_src;
reg lp_clk_mux;
reg [7:0] cksum;
reg send_cksum;
reg send_dummy;
reg force_error;
parameter DEVICE = "Stratix";
// worst case clk 200MHz
`define local_clk_period 5000
// Drive local clk source
initial begin
clk = 1'b0;
while (1) #(`local_clk_period/2) clk = ~clk;
end
// lp_clk 500MHz
`define lp_clk_period 2000
// Drive lp_clk source
initial begin
lp_clk_src = 1'b0;
while (1) #(`lp_clk_period/2) lp_clk_src = ~lp_clk_src;
end
initial
begin
seed = 1;
rst_n = 1'b0;
lp_clk_mux = 1'b0;
rdreq = 1'b0;
rvere = 1'b1;
bcmpi_n = 1'b1;
cksum = 8'b0;
send_cksum = 1'b0;
send_dummy = 1'b0;
force_error = 1'b0;
repeat (5) @(posedge clk);
rst_n = 1'b1;
repeat (3) @(posedge clk);
@(negedge lp_clk_src);
fork
lp_traffic;
begin
repeat (7) @(posedge lp_clk);
bcmpi_n = 1'b0;
repeat (4) @(posedge lp_clk);
bcmpi_n = 1'b1;
end
join
repeat (30) @(negedge lp_clk_src);
// with forced error
@(negedge lp_clk_src);
force_error = 1'b1;
lp_traffic;
force_error = 1'b0;
repeat (20) @(negedge lp_clk_src);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (5) @(posedge clk);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (4) @(posedge clk);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (3) @(posedge clk);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (2) @(posedge clk);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (1) @(posedge clk);
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
@(negedge lp_clk_src);
for (i=1; i<5; i=i+1)
lp_traffic;
repeat (5) @(posedge clk);
$finish;
end
always
begin
repeat (5) @(posedge clk);
while (empty)
@(posedge clk);
@(posedge clk);
rdreq = 1'b1;
while (~empty)
@(posedge clk);
rdreq = 1'b0;
end
always @(lp_clk_src)
begin
#(`lp_clk_period/4);
lp_data_src = $random(seed);
end
reg [3:0] cksum_src;
always @(posedge send_cksum)
begin
cksum_src <= force_error ? ~cksum[3:0] : cksum[3:0];
@(posedge lp_clk) #(`lp_clk_period/4);
cksum_src <= force_error ? ~cksum[7:4] : cksum[7:4];
end
always @(send_dummy or send_cksum or cksum_src or lp_clk_mux or lp_data_src)
if (send_dummy)
lp_data <= 4'b0;
else if (send_cksum)
lp_data <= cksum_src;
else if (lp_clk_mux)
lp_data <= lp_data_src;
else
lp_data <= 4'b0;
assign lp_clk = lp_clk_mux ? lp_clk_src : 1'b0;
//---------------------------------------------------------------------------
// *** Write this properly to generate 4 words, calculate checksums
// *** and transmit them
//---------------------------------------------------------------------------
task lp_traffic;
reg [3:0] cksum_nibble;
begin
lp_clk_mux <= 1'b1;
repeat (16)
begin
@(posedge lp_clk_src);
cksum_nibble <= lp_data;
@(negedge lp_clk_src);
cksum <= cksum + {lp_data, cksum_nibble};
end
#(`lp_clk_period/4);
if (rvere)
begin
send_cksum <= 1'b1;
@(posedge lp_clk_src);
@(negedge lp_clk_src) #(`lp_clk_period/4);
send_cksum <= 1'b0;
send_dummy <= 1'b1;
@(posedge lp_clk_src);
@(negedge lp_clk_src) #(`lp_clk_period/4);
send_dummy <= 1'b0;
end
lp_clk_mux <= 1'b0;
cksum <= 8'b0;
end
endtask
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
lp_rx #(DEVICE) dut (.clk (clk),
.rst_n (rst_n),
.datain (lp_data),
.inclock (lp_clk),
.inclock_en (1'b1),
.acko (acko),
.bcmpi_n (bcmpi_n),
.rvere (rvere),
.rcser (rcser),
.rdreq (rdreq),
.empty (empty),
.rdata (rdata)
);
endmodule
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?