먼저 맞춤법 오류를 용서하십시오. 영어는 제 모국어가 아닙니다.Verilog 테스트 벤치가 컴파일되지만 시뮬레이션은 700 tick으로 멈 춥니 다.
프로젝트의 경우 iverilog를 사용하여 "기본"논리를 시뮬레이션하려고합니다. 현재 어떤 이유로 클럭 신호의 세 번째 아래쪽 측면에 매달려있는 시뮬레이션이 있습니다. 테스트 벤치는 잘 컴파일되지만 시뮬레이션 중에는 6ns에서 멈 춥니 다. 신호를 조사해 보면 내가 알 수있는 한 정의되지 않은 신호 나 래치 상황이 나타나지 않습니다. 이 때 변경되는 유일한 신호는 CLK 신호입니다.
시뮬레이션은 비동기 클리어 및 리셋 (CBU22)이있는 간단한 2 비트 업 카운터이며 목표는 최대 값에 도달 할 때까지 카운터를 증가시키고 리셋 될 때까지이 신호를 유지하는 것입니다. 따라서 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 모델입니다. 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 //
테스트 모듈의 게이트를 변경하면 시뮬레이션을 완료 할 수 있지만 시뮬레이트 할 동작이 아닙니다.
마지막으로 내가 포함하고있는 라이브러리입니다. 래티스가 제공하는 라이브러리를 기반으로합니다. 최종 코드는 해당 장치 중 하나에서 구현됩니다. 나는이 라이브러리가 문제가 있다는 것을 알지만 문제를 재현하기 위해이 라이브러리를 포함 시켰습니다.
라이브러리/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
내가 뭔가 불분명 경우 알려 주시기 바랍니다 가능한 한 명확하게하려고 노력했다.
테스트 벤치에서 차단 및 비 차단 지연 할당을 잔인하게 섞어서 예상 한대로 작동하지 않는 것일 수 있습니다. –
Eugine에 대한 답변을 보내 주셔서 감사합니다. 그러나 혼합은 의도적입니다. 차단 할당은 테스트 벤치를 초기화하는 데 사용됩니다. 모든 것을 비 블로킹 (또는 블로킹 문장)으로 바꾸면 아무런 효과가 없습니다.문제가 ** lsc_minimal.v **의 프리미티브 DFF_FD에있는 테이블을 사용하여 정의 된 FD21 모듈에 있다고 생각하기 시작했습니다. 그러나 나는 테이블에서 무엇이 문제를 일으키는 지 알 수 없다. – Rendagar