2015-01-27 1 views
0

먼저 맞춤법 오류를 용서하십시오. 영어는 제 모국어가 아닙니다.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 

내가 뭔가 불분명 경우 알려 주시기 바랍니다 가능한 한 명확하게하려고 노력했다.

+0

테스트 벤치에서 차단 및 비 차단 지연 할당을 잔인하게 섞어서 예상 한대로 작동하지 않는 것일 수 있습니다. –

+0

Eugine에 대한 답변을 보내 주셔서 감사합니다. 그러나 혼합은 의도적입니다. 차단 할당은 테스트 벤치를 초기화하는 데 사용됩니다. 모든 것을 비 블로킹 (또는 블로킹 문장)으로 바꾸면 아무런 효과가 없습니다.문제가 ** lsc_minimal.v **의 프리미티브 DFF_FD에있는 테이블을 사용하여 정의 된 FD21 모듈에 있다고 생각하기 시작했습니다. 그러나 나는 테이블에서 무엇이 문제를 일으키는 지 알 수 없다. – Rendagar

답변

0

원래 회로에 무엇이 잘못되었는지 (시간이 없음) 결코 알지 못했지만 아래의 설명과 함께 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 //