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 //
首先请原谅任何拼写错误,英语不是我的母语。
对于一个项目,我正在尝试使用 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 //