Код Verilog компилируется, но почему симуляция не запускается? - PullRequest
0 голосов
/ 09 марта 2011

Мой код состоит из двух файлов.В одном файле есть все модули, а в одном - тестовый стенд.Когда я пытаюсь запустить симуляцию на тестовом стенде, я получаю неразрешенную опорную ошибку в этой строке в одном из моих модулей:

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

Эта строка происходит в модуле, который вызывает мой тестовый стенд.*

В чем может быть проблема?

Это код тестового стенда.`timescale 1ns / 100ps

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

Это то, что вызывается на испытательном стенде

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;
always@(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

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

В дополнение к Adam12 и GuanoLoco, только некоторые общие примечания:

Вы назначаете out_s [0] в два раза больше, чем ваш модуль CarryLookAheadAdder

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

You are 'используя вашу переменную "g" в любом месте.Вы, вероятно, хотите, чтобы это была ваша буква "с", так как я предполагаю, что это ваш керри.

2 голосов
/ 09 марта 2011

Вы пропустили имя экземпляра. Ваш симулятор, вероятно, думает, что оператор является экземпляром UDP, поэтому он дает неразрешенную ошибку ссылки во время разработки проекта. Компиляция не разрешает экземпляры модуля / UDP с определениями, поэтому эти ошибки не приведут к сбою компиляции.

Попробуйте

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

EDIT: Add_half не является функцией или задачей и не может быть помещен в блок всегда. Это модуль, и поэтому он создается, а не вызывается. Помните, что вы моделируете логическую схему здесь.

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];

Кто-то может упомянуть цикл, но я думаю, что вы должны пока игнорировать их, даже если они здесь уместны.

1 голос
/ 09 марта 2011

В дополнение к шагам, упомянутым в ответе Adam12 (добавить имена экземпляров, выйти из блока всегда), вам необходимо изменить тип проводов подключения.

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

должно быть

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

Это потому, что они подключены напрямую к портам на модуле. Вы бы использовали reg только для того, что было назначено в блоке Always.

...