You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.5 KiB
168 lines
4.5 KiB
// Created by IP Generator (Version 2021.1-SP7 build 86875)
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 2014 PANGO MICROSYSTEMS, INC
|
|
// ALL RIGHTS REVERVED.
|
|
//
|
|
// THE SOURCE CODE CONTAINED HEREIN IS PROPRIETARY TO PANGO MICROSYSTEMS, INC.
|
|
// IT SHALL NOT BE REPRODUCED OR DISCLOSED IN WHOLE OR IN PART OR USED BY
|
|
// PARTIES WITHOUT WRITTEN AUTHORIZATION FROM THE OWNER.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Library:
|
|
// Filename:TB ShiftRegister_tb.v
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
`timescale 1ns / 1ps
|
|
|
|
module ShiftRegister_tb ();
|
|
|
|
localparam T_CLK_PERIOD = 10 ; //clock a half perid
|
|
localparam T_RST_TIME = 200 ; //reset time
|
|
|
|
localparam FIXED_DEPTH = 1024 ; // @IPC int 1,1024
|
|
|
|
localparam VARIABLE_MAX_DEPTH = 1024 ; // @IPC int 1,1024
|
|
|
|
localparam DATA_WIDTH = 1 ; // @IPC int 1,256
|
|
|
|
localparam SHIFT_REG_TYPE = "dynamic_latency" ; // @IPC enum fixed_latency,dynamic_latency
|
|
|
|
localparam SHIFT_REG_TYPE_BOOL = 1 ; // @IPC bool
|
|
|
|
localparam RST_TYPE = "ASYNC" ; // @IPC enum ASYNC,SYNC
|
|
|
|
|
|
|
|
localparam DEPTH = (SHIFT_REG_TYPE=="fixed_latency") ? FIXED_DEPTH :
|
|
(SHIFT_REG_TYPE=="dynamic_latency") ? VARIABLE_MAX_DEPTH : 0;
|
|
|
|
|
|
localparam ADDR_WIDTH = (DEPTH<=16) ? 4 :
|
|
(DEPTH<=32) ? 5 :
|
|
(DEPTH<=64) ? 6 :
|
|
(DEPTH<=128) ? 7 :
|
|
(DEPTH<=256) ? 8 :
|
|
(DEPTH<=512) ? 9 : 10 ;
|
|
|
|
|
|
// variable declaration
|
|
reg clk_tb ;
|
|
reg tb_rst ;
|
|
reg [ADDR_WIDTH-1:0] tb_addr ;
|
|
reg [ADDR_WIDTH-1:0] addr ;
|
|
reg [DATA_WIDTH-1:0] tb_wrdata ;
|
|
wire [DATA_WIDTH-1:0] tb_rddata ;
|
|
reg check_err ;
|
|
reg [2:0] results_cnt;
|
|
wire [DATA_WIDTH-1:0] tb_tmp ;
|
|
reg [ADDR_WIDTH-1:0] cnt ;
|
|
reg cmp_en ;
|
|
|
|
assign tb_tmp = tb_rddata + DEPTH + 1;
|
|
//************************************************************ CGU ****************************************************************************
|
|
//generate clk_tb
|
|
initial
|
|
begin
|
|
|
|
clk_tb = 0;
|
|
forever #(T_CLK_PERIOD/2) clk_tb = ~clk_tb;
|
|
end
|
|
|
|
|
|
//********************************************************* DGU ********************************************************************************
|
|
|
|
initial begin
|
|
|
|
tb_addr = 0;
|
|
tb_wrdata = 0;
|
|
cnt = 0;
|
|
tb_rst = 1;
|
|
|
|
addr = VARIABLE_MAX_DEPTH;
|
|
|
|
#T_RST_TIME ;
|
|
tb_rst = 0;
|
|
#10 ;
|
|
$display("writing shiftregister");
|
|
write_shiftregister;
|
|
#10;
|
|
$display("shiftregister Simulation done");
|
|
if (|results_cnt)
|
|
$display("Simulation Failed due to Error Found.") ;
|
|
else
|
|
$display("Simulation Success.") ;
|
|
$finish ;
|
|
end
|
|
|
|
|
|
//***************************************************************** DUT INST **************************************************************************************
|
|
|
|
always@(posedge clk_tb or posedge tb_rst) begin
|
|
if(tb_rst)
|
|
check_err = 0;
|
|
else begin
|
|
cnt = cnt + 1;
|
|
if(cnt > DEPTH + 2 && tb_wrdata != tb_tmp && cmp_en) begin
|
|
check_err = 1;
|
|
end
|
|
else
|
|
check_err = 0;
|
|
end
|
|
end
|
|
|
|
always @(posedge clk_tb or posedge tb_rst)
|
|
begin
|
|
if (tb_rst)
|
|
results_cnt <= 3'b000 ;
|
|
else if (&results_cnt)
|
|
results_cnt <= 3'b100 ;
|
|
else if (check_err)
|
|
results_cnt <= results_cnt + 3'd1 ;
|
|
end
|
|
|
|
integer result_fid;
|
|
initial begin
|
|
result_fid = $fopen ("sim_results.log","a");
|
|
$fmonitor(result_fid,"err_chk=%b",check_err);
|
|
end
|
|
|
|
GTP_GRS GRS_INST(
|
|
.GRS_N(1'b1)
|
|
);
|
|
ShiftRegister U_ShiftRegister (
|
|
|
|
.addr (addr ), //input wire [`T_A_ADDR_WIDTH-1 : 0]
|
|
|
|
.din (tb_wrdata ), //input wire [`T_A_DATA_WIDTH-1 : 0]
|
|
.dout (tb_rddata ), //output wire [`T_A_DATA_WIDTH-1 : 0]
|
|
.rst (tb_rst ), //input wire
|
|
.clk (clk_tb )
|
|
);
|
|
|
|
task write_shiftregister;
|
|
|
|
integer i;
|
|
begin
|
|
tb_wrdata = 0;
|
|
tb_addr = 0;
|
|
cmp_en = 0;
|
|
|
|
while ( tb_addr < 2**ADDR_WIDTH - 1)
|
|
|
|
begin
|
|
@(posedge clk_tb);
|
|
tb_addr = tb_addr + 1'b1;
|
|
tb_wrdata = tb_wrdata + 1'b1;
|
|
cmp_en = 1'b1;
|
|
end
|
|
cmp_en = 0;
|
|
end
|
|
endtask
|
|
|
|
endmodule
|
|
|