2011-03-09 4 views
0

내 코드는 두 개의 파일로 구성됩니다. 하나의 파일에는 모든 모듈이 있고 하나의 파일에는 테스트 벤치가 있습니다. 내가 테스트 벤치에서 시뮬레이션을 실행하려고 할 때, 나는 나의 모듈 중 하나에이 라인에 해결되지 않은 참조 오류가 발생합니다 :Verilog 코드가 컴파일되지만 시뮬레이션이 실행되지 않는 이유는 무엇입니까?

Add_half (p[3], g[3], in_a[3], in_b[3]); 

이 줄 내 테스트 벤치 호출 모듈에서 발생합니다.

무엇이 문제 일 수 있습니까?

이것은 테스트 벤치 용 코드입니다. `타임 스케일 1NS은/

module CARRYLOOKAHEAD_TB; 

reg [3:0] in_a_tb; 
reg [3:0] in_b_tb; 
reg in_c0_tb; 
wire [3:0] s_tb; 
wire c4_tb; 

CarryLookAheadAdder DUT (.in_a(in_a_tb), .in_b(in_b_tb), .in_c0(in_c0_tb), .out_s(s_tb), .out_c4(c4_tb)); 
initial 
begin 
in_a_tb = 4'b0000; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b0000; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b1; 
#50 
in_a_tb = 4'b0001; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b1111; 
in_a_tb = 4'b0001; 
in_c0_tb = 1'b0; 
#50 
in_a_tb = 4'b1111; 
in_a_tb = 4'b0000; 
in_c0_tb = 1'b1; 
#50 $stop; 
#20 $finish; 
end 
endmodule 

이이 테스트 벤치에 의해 호출되는 것입니다 모듈

module Add_half (sum, c_out, a, b); 
input a, b; 
output c_out, sum; 
assign sum = a^b; 
assign c_out = a & b; 
endmodule 

코드입니다 100PS

module CarryLookAheadAdder (in_a, in_b, in_c0, out_s, out_c4); 
input [3:0] in_a; 
input [3:0] in_b; 
input in_c0; 
output reg [3:0] out_s; 
output reg out_c4; 
reg [3:0] p; 
reg [3:0] g; 
reg [3:0] c; 
[email protected](in_a, in_b, in_c0) 
begin 
out_s[0] = (in_a[0]^in_b[0])^in_c0; 
Add_half (p[3], g[3], in_a[3], in_b[3]); 
Add_half (p[2], g[2], in_a[2], in_b[2]); 
Add_half (p[1], g[1], in_a[1], in_b[1]); 
Add_half (p[0], g[0], in_a[0], in_b[0]); 
out_c4 = c[4]; 
out_s[3] = p[3]^c[3]; 
out_s[2] = p[2]^c[2]; 
out_s[1] = p[1]^c[1]; 
out_s[0] = p[0]^c[0]; 
end 
endmodule 
+0

문제의 모든 코드 (Add_half 정의)와 오류 메시지 및 사용중인 도구를 모두 게시 한 경우 매우 유용합니다. –

+0

내가 얻는 오류 메시지는 "해결되지 않은 참조가 Add_half"입니다. 나는 Modelsim을 사용하고있다. –

+0

"Add_half (p [3], g [3], in_a [3], in_b [3]) 문을 포함하는 코드 게시 : " –

답변

2

당신은 인스턴스 이름을 놓치고있어 . 당신의 시뮬레이터는 그 문장이 UDP 인스턴스라고 생각할 것입니다. 그래서 디자인 정교화 중에 해결되지 않은 참조 오류를줍니다. 컴파일은 모듈/UDP 인스턴스를 정의로 해석하지 않으므로 이러한 오류로 인해 컴파일이 실패하지 않습니다.

시도

Add_half의 add_half_inst (p [3], g [3] in_a [3] in_b [3]);

편집 : Add_half는 함수 또는 작업이 아니며 always 블록에 배치 할 수 없습니다. 이것은 모듈이므로 인스턴스되지 않고 호출됩니다. 여기서 논리 회로를 모델링한다는 것을 기억하십시오.

Add_half add_half_0(p[3], g[3], in_a[3], in_b[3]); 
Add_half add_half_1(p[3], g[3], in_a[3], in_b[3]); 
... 

각 인스턴스에는 고유 한 이름이 있습니다. 동일한 회로를 4 번 설치하고 입력과 출력을 간단하게 배선합니다. 인스턴스 이름은 계층 적 식별자를 사용하여 고유하게 확인할 수 있도록 필요합니다.

이 C로 작동하지 않습니다 [3 : 0]입니다

out_c4 = c[4]; 

누군가가 루프를 말할 수 있습니다하지만 난 당신이 지금은 여기에 적합한에도 불구을위한 사람들을 무시한다고 생각합니다.

+0

시도 할 때 다음과 같은 오류 메시지가 나타납니다. 정의되지 않은 변수 : Add_half. "add_half_inst"근처 : 구문 오류, 예기치 않은 "IDENTIFIER" –

+0

이제 컴파일러는 Add_half의 민감도 목록에서 두 번째 매개 변수에 대해 불평합니다. 그것은 "포트 'c_out'에 대한 잘못된 출력 또는 inout 포트 연결을 말합니다. 첫 번째 매개 변수에 대해 아무 말도하지 않을 때 왜 두 번째 매개 변수에 대해 불만을 제기하는지 이해할 수 없습니다. –

1

Adam12의 대답 (인스턴스 이름 추가, 항상 블록에서 벗어남)에 언급 된 단계 외에도 연결선의 유형을 변경해야합니다.

reg [3:0] p; 
reg [3:0] g; 

이러한 모듈의 포트에 직접 연결되어 있기 때문이다

wire [3:0] p; 
wire [3:0] g; 

이어야한다. 항상 블록에 할당 된 것에 대해서만 reg를 사용합니다.Adam12 & GuanoLoco, 그냥 일반 노트에 추가

2

:

당신은 할당 out_s [0] 두 번 CarryLookAheadAdder 모듈입니다 당신은 당신의 "g"변수를 사용하지 않는

out_s[0] = (in_a[0]^in_b[0])^in_c0;
...
out_s[0] = p[0]^c[0];

어디서든 출력 할 수 있습니다. 당신이 아마 이걸 당신의 "c"가되기를 원합니다.

관련 문제