Verilog 测试平台编译但模拟停止在 700 个刻度

Verilog test bench compiles but simulate stops at 700 ticks

首先请原谅任何拼写错误,英语不是我的母语。

对于一个项目,我正在尝试使用 iverilog 模拟一些 "basic" 逻辑。目前我有一个模拟,由于某种原因挂在时钟信号的第三个向下侧翼上。测试平台编译良好,但在模拟过程中它停止在 6ns。据我所知,对信号的调查显示没有未定义的信号或闩锁情况。当时唯一变化的信号是CLK信号。

模拟是一个简单的 2 位递增计数器,具有异步清零和复位功能 (CBU22),目标是让计数器增加直到达到最大值,然后保持该信号直到复位。因此,当 CBU22.Q0 和 CBU22.Q1 都处于高电平时,这将导致 CBU22.CAO 变为高电平,进而应将 CBU22.EN_IN 拉低以防止其进一步计数。

如果有人知道模拟挂起的原因,我将非常感谢您的意见。

我用来编译和运行代码的命令是:

> iverilog -o test -ylibrary test_tb.v
> ./test

我确定这是正确的,因为我在其他模型上使用了相同的命令并且这些模型模拟得很好。

这是测试问题台的代码

test_tb.v:

`include "library/lsc_minimal.v"
`timescale 1 ns / 1 ns

// Define Module for Test Fixture
module test_tb();

// Inputs
    reg CLK;
    reg CD;
    reg EN;

// Outputs
    wire Q0;
    wire Q1;

// Bidirs


// Instantiate the UUT
    test UUT (
            .EN(EN),
            .CLK(CLK),
            .CD(CD),
            .Q0(Q0),
            .Q1(Q1)
            );

    always #1 CLK <= !CLK;

// Initialize Inputs
// You can add your stimulus here
    initial begin
    $dumpfile ("signals.vcd"); 
    $dumpvars;
        // initialize variables
        CLK = 0;
        CD = 0;
        EN = 0;

        //Simulation parameters
        #1 EN <= 1;
        #8 $finish;
    end

endmodule //test_tb

这是我要模拟的 verilog 模型

library/test.v:

/* Verilog model */

module test(EN, CLK, CD, Q0, Q1);
    input EN, CLK, CD;
    output Q0, Q1;
    wire CAI, CAO, EN_IN, NOT_CAO;

buf (CAI,1);
and (EN_IN,EN,NOT_CAO);
not (NOT_CAO,CAO);

CBU22 I1 (
            .Q0(Q0),
            .Q1(Q1),
            .CAO(CAO),
            .CAI(CAI),
            .CLK(CLK),
            .EN(EN_IN),
            .CD(CD)
            );

endmodule //

更改测试模块中的和门允许模拟完成,但这不是我想要模拟的行为。

最后,这是我要包含的库。它基于 Lattice 提供的库。最终代码将在他们的其中一台设备上实现。我发现这个库不太可能有问题,但是我已经包含了它,所以你可以用它来重现我的问题。

library/lsc_minimal.v:

/*
Minimal modules for counter test
Variables changed to remove duplicate names
*/

/*
* "Cell CBU22"                                                                 *
*/

`timescale 10 ps / 10 ps 
module CBU22(
    Q0, Q1, CAO, CAI, 
    CLK, EN, CD);

    output Q0;
    output Q1;
    output CAO;
    input CAI;
    input CLK;
    input EN;
    input CD;

    FD21 I1  (.Q0(QI0), .D0(CBU22_I8_Z0 ), .CLK(CLK), .CD(CD));
    FD21 I2  (.Q0(QI1), .D0(CBU22_I9_Z0 ), .CLK(CLK), .CD(CD));
    AND2 I3  (.Z0(CBU22_I3_Z0 ), .A0(CAI), .A1(EN));
    AND3 I4  (.Z0(CBU22_I4_Z0 ), .A0(QI0), .A1(CAI), .A2(EN));
    AND4 I5  (.Z0(CAO), .A0(QI0), .A1(QI1), .A2(CAI), .A3(EN));
    BUF I6  (.Z0(Q1), .A0(QI1));
    BUF I7  (.Z0(Q0), .A0(QI0));
    LXOR2 I8  (.Z0(CBU22_I8_Z0 ), .A0(QI0), .A1(CBU22_I3_Z0 ));
    LXOR2 I9  (.Z0(CBU22_I9_Z0 ), .A0(QI1), .A1(CBU22_I4_Z0 ));
endmodule

/*
* "Cell AND2"                                                                 *
*/

`timescale 10 ps / 10 ps 

module AND2 (Z0, A0, A1);

    input  A0;
    input  A1;

    output  Z0;

    and I10 (Z0, A0, A1);

endmodule

/*
* "Cell AND3"                                                                 *
*/
`timescale 10 ps / 10 ps
module AND3 (Z0, A0, A1, A2);

    input  A0;
    input  A1;
    input  A2;

    output  Z0;

    and I11 (Z0, A0, A1, A2);

endmodule

/*
* "Cell AND4"                                                                 *
*/

`timescale 10 ps / 10 ps
module AND4 (Z0, A0, A1, A2, A3);

    input  A0;
    input  A1;
    input  A2;
    input  A3;

    output  Z0;

    and I12 (Z0, A0, A1, A2, A3);

endmodule

/*
* "Cell BUF"                                                                  *
*/
`timescale 10 ps / 10 ps
module BUF (Z0, A0);

    input  A0;

    output  Z0;

    buf I13  (Z0, A0);

endmodule

/*
* "Cell LXOR2"                                                                *
*/
`timescale 10 ps / 10 ps
module LXOR2 (Z0, A0, A1);

    input  A0;
    input  A1;

    output  Z0;

    xor I14 (Z0, A0, A1);

endmodule

/**************
*     FD21    *
***************/

`timescale 10 ps / 10 ps
module FD21 (Q0, D0, CLK, CD);

  input   CLK, D0, CD;
  output  Q0;
  supply1 reset;
  //reg Q0;

  not  blk0 (t1, reset);
  or   blk1 (t2, t1, CD);

  DFF_FD blk2 (Q0, D0, CLK, t2);

endmodule

/**************************
*     PRIMITIVE DFF_FD    *
**************************/

`timescale 10 ps / 10 ps
primitive DFF_FD (Q, D, CP, R);

    output Q;  
    input  D, CP, R;
    reg    Q; 

    initial Q = 0; //Added to prevent from remaining undefined

    table
    //  D   CP      R   :   Qt  :   Qt+1

        1   (01)    0   :   ?   :   1;  // clocked data
        0   (01)    0   :   ?   :   0;

        0   (01)    x   :   ?   :   0;  // pessimism
        0    ?      x   :   0   :   0;  // pessimism

        1    0      x   :   0   :   0;  // pessimism
        1    x    (?x)  :   0   :   0;  // pessimism
        1    1    (?x)  :   0   :   0;  // pessimism

        x    0      x   :   0   :   0;  // pessimism
        x    x    (?x)  :   0   :   0;  // pessimism
        x    1    (?x)  :   0   :   0;  // pessimism

        1   (x1)    0   :   1   :   1;  // reducing pessimism
        0   (x1)    0   :   0   :   0;                          
        1   (0x)    0   :   1   :   1;  
        0   (0x)    0   :   0   :   0;  


        ?   ?       1   :   ?   :   0;  // asynchronous clear

        ?   (?0)    ?   :   ?   :   -;  // ignore falling clock
        ?   (1x)    ?   :   ?   :   -;  // ignore falling clock
        *    ?      ?   :   ?   :   -;  // ignore the edges on data

        ?    ?    (?0)  :   ?   :   -;  // ignore the edges on clear 

    endtable
endprimitive

我尽量说得清楚,但如果有不清楚的地方请告诉我。

从来没有完全弄清楚原始电路有什么问题(没有时间),但是用下面的描述替换 test.v 允许模拟完成并产生正确的结果。

/* Verilog model */

module test(EN, CLK, CD, Q0, Q1);
    input EN, CLK, CD;
    output Q0, Q1;
    wire CAI, CAO, EN_IN, NOT_CAO;

buf (CAI,1);
and (W_1,Q0,Q1);
not (EN_IN,W_1);

CBU22 I1 (
            .Q0(Q0),
            .Q1(Q1),
            .CAO(CAO),
            .CAI(CAI_IN),
            .CLK(CLK),
            .EN(EN_IN),
            .CD(CD)
            );

endmodule //