2013-03-07 3 views
0

이 Verilog 코드를 컴파일하고 싶지만 MultiP 모듈의 B 모듈 인스턴스에 오류가 있습니다. 오류 1 : 정의되지 않은 변수 B 오류 2 : "Adder1"근처 : 구문 오류, 예기치 않은 IDENTIFIER.오류가 발생 했습니까?

코드 :

module A(x,y,ci,co,sum); 
    input x,y,ci; 
    output co,sum; 
    reg co,sum; 

    always @(x | y | ci) 
     begin 
     sum = x^y^ci; 
     co = (x & y) | (ci & y) | (ci & x); 
    end 
endmodule 

module B(ppk,x,y,ci,co,ppko); 
    input x,y,ppk,ci; 
    output ppko,co; 
    reg ppko,co; 

    always @(x | y | ci | ppk) 
    begin 
     A((x & y),ppk,ci,co,ppko); 
    end 
endmodule 

module MultiP(x,y,ppko); 
    input [3:0] x; 
    input [3:0] y; 
    output [7:0] ppko; 
    wire [12:0] cW; 
    wire [12:0] ppW; 

    always @(x | y) 
    begin 

    B Adder1((x[0]&y[1]) , y[0], x[1], 0  , cW[0] , ppko[1]); 
    B Adder2((x[0]&y[2]) , y[1], x[1], cW[0] , cW[1] , ppW[0] ); 
    B Adder3((x[0]&y[3]) , y[2], x[1], cW[1] , cW[2] , ppW[1] ); 
    B Adder4(0   , y[3], x[1], cW[2] , cW[3] , ppW[2] ); 

    B Adder5(ppW[1] , y[0] , x[2] , 0  , cW[4] , ppko[2]); 
    B Adder6(ppW[2] , y[1] , x[2] , cW[4] , cW[5] , ppW[3] ); 
    B Adder7(ppW[3] , y[2] , x[2] , cW[5] , cW[6] , ppW[4] ); 
    B Adder8(cW[3] , y[3] , x[2] , cW[6] , cW[7] , ppW[5] ); 

    B Adder9(ppW[3] , y[0] , x[3] , 0  , cW[8] , ppko[3]); 
    B Adder10(ppW[4] , y[1] , x[3] , cW[8] , cW[9] , ppko[4]); 
    B Adder11(ppW[5] , y[2] , x[3] , cW[9] , cW[10] , ppko[5]); 
    B Adder12(cW[7] , y[3] , x[3] , cW[10] , ppko[7] , ppko[6]); 

    end  

endmodule 내가 코드에 최소한의 변경을

+2

'always' 블록 감도 목록의'| '기호는'또는' – Marty

+1

이어야하며'always' 블록 안에'A'를 인스턴스화하려고합니다. 이것은 잘못된 것입니다 – Marty

+1

@ Marty - 대답 상자에 답변을 입력하십시오 : – Tim

답변

0

은 컴파일 얻을 : 마티가 언급 한 바와 같이

module A(x,y,ci,co,sum); 
    input x,y,ci; 
    output co,sum; 
    reg co,sum; 

    always @* begin 
     sum = x^y^ci; 
     co = (x & y) | (ci & y) | (ci & x); 
    end 
endmodule 

module B(ppk,x,y,ci,co,ppko); 
    input x,y,ppk,ci; 
    output ppko,co; 
    reg ppko,co; 

    A A ((x & y),ppk,ci,co,ppko); 
endmodule 

module MultiP(x,y,ppko); 
    input [3:0] x; 
    input [3:0] y; 
    output [7:0] ppko; 
    wire [12:0] cW; 
    wire [12:0] ppW; 

    B Adder1((x[0]&y[1]) , y[0], x[1], 0  , cW[0] , ppko[1]); 
    B Adder2((x[0]&y[2]) , y[1], x[1], cW[0] , cW[1] , ppW[0] ); 
    B Adder3((x[0]&y[3]) , y[2], x[1], cW[1] , cW[2] , ppW[1] ); 
    B Adder4(0   , y[3], x[1], cW[2] , cW[3] , ppW[2] ); 

    B Adder5(ppW[1] , y[0] , x[2] , 0  , cW[4] , ppko[2]); 
    B Adder6(ppW[2] , y[1] , x[2] , cW[4] , cW[5] , ppW[3] ); 
    B Adder7(ppW[3] , y[2] , x[2] , cW[5] , cW[6] , ppW[4] ); 
    B Adder8(cW[3] , y[3] , x[2] , cW[6] , cW[7] , ppW[5] ); 

    B Adder9(ppW[3] , y[0] , x[3] , 0  , cW[8] , ppko[3]); 
    B Adder10(ppW[4] , y[1] , x[3] , cW[8] , cW[9] , ppko[4]); 
    B Adder11(ppW[5] , y[2] , x[3] , cW[9] , cW[10] , ppko[5]); 
    B Adder12(cW[7] , y[3] , x[3] , cW[10] , ppko[7] , ppko[6]); 
endmodule 

, 나는에서는 항상 차단 감도 목록을 대체 모듈 A는 *입니다. A와 B 인스턴스 주변의 항상 블록을 제거했습니다. A 인스턴스의 인스턴스 이름을 추가했습니다.

+0

감사합니다. 이제 어떻게 테스트 벤치 코드를 작성할 수 있습니까? – user1268769

+0

반갑습니다. 먼저 다른 모듈을 생성하고 MultiP 인스턴스를 배치하십시오. – toolic

1

코드에 다른 미묘한 문제가 있다고 말할 수 있습니다.

먼저 암시 적 그물이 선언되지 않았는지 확인하는 것이 좋습니다. 그렇지 않으면 맞춤법이 틀린 순 이름은 그을음 ​​비트 그물이 자동으로 그 결과 다음

`default_nettype none 

으로 이상한 행동으로 생성 될 수 있습니다 I 조언 모듈의 포트 선언에 포트 그물의 순 유형 선언을하는

module A(input wire x, 
    input wire y, 
    input wire ci, 

    output reg co, 
    output reg sum); 

    always_comb begin //Use this if you have a system verilog compiler 
    always @* begin //Use @* as suggested otherwise 
     sum = x^y^ci; 
     co = (x & y) | (ci & y) | (ci & x); 
    end 
endmodule 

module B(input wire ppk, 
    input wire x, 
    input wire y, 
    input wire ci, 

    output reg co, 
    output reg ppko); 

또한 다음과 같이 명명 된 매개 변수 인스턴스화를 사용하는 것이 좋습니다.

A a(.x(x&y), 
     .y(ppk), 
     .ci(ci), 
     .co(co), 
     .ppko(ppko)); 

endmodule 

module MultiP(input wire [3:0] x, 
      input wire [3:0] y, 
      output reg [7:0] ppko); 

    wire [12:0] cW; 
    wire [12:0] ppW; 

    B Adder1(.ppk(x[0]&y[1]), 
     .x(y[0]), 
     .y(x[1]), 
     .ci(0), 
     .co(cW[0]), 
     .ppko(ppko[1])); 

... //The rest of all B instantiations 

endmodule 

앞서 언급 한 모듈 인스턴스화는 항상 블록으로 수행되지 않습니다.

Verilog에 대한 좋은 책을 읽어야한다고 생각합니다. Verilog HDL에서 개인적으로 배웠습니다 http://www.amazon.com/Verilog-HDL-paperback-2nd-Edition/dp/0132599708/ref=sr_1_1?ie=UTF8&qid=1362691992&sr=8-1&keywords=verilog+hdl