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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 

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