有人可以向我解释我做错了什么。我不知道我是不是理解这个概念或者是什么。我看了两个可靠的例子,这两个例子都提供了彻底的代码,但也许我接错了什么东西。
1st - 我创建了一个名为Adder的文件,下面是我的代码。这完全没问题,我用这个创建/运行了一个测试平台文件,所以我知道这完全符合预期。但是,我应该以某种方式将我的FullAdder文件或FullAdder文件的测试平台连接到Adder文件?这些是完全独立的文件,从不连接吗?
module Adder (a,b,ci,co,s);
input a,b,ci;
output co,s;
assign s=a^b^ci;
assign co=(a&b)|(a&ci)|(b&ci);
endmodule
第二 - 下面是我的FullAdder文件的代码。我不确定这是否正确,但让我知道在哪里可以做出改变。我假设我创建的测试平台将链接到这个FullAdder文件?这个文件的语法检查正常,所以也许它是导致我出现问题的测试平台...
module FullAdder(a,b,ci,s);
input [3:0] a,b;
input ci;
output [3:0] s;
wire [2:0] co; // Is the wire correct here? I created this off something I saw.
Adder ADD1(a[0],b[0],ci,s[0],co[0]);
Adder ADD2(a[1],b[1],co[0],s[1],co[1]);
Adder ADD3(a[2],b[2],co[1],s[2],co[2]);
Adder ADD4(a[3],b[3],co[2],s[3],s[4]);
endmodule
3 - 我不了解测试台并将所有内容连接在一起。我看过这两个有两种不同方法的链接。 Link 1 Link 2。我试图复制链接2,但似乎无法让它工作。帮助
答案 0 :(得分:0)
Adder ADD4(a[3],b[3],carry[2],s[3],s[4]);
此实例化假设s是一个元素位于第4位的向量,但是你对s的定义是[3:0]
,所以4不是有效位置。将其更改为
output [4:0] s;
使用Verilog 2001模块定义样式(类似于ANSI C)是绝对的。你的模块是这样的:
module FullAdder (
input wire [3:0] a,
input wire [3:0] b,
input wire ci,
output wire [4:0] s
);
wire [2:0] co;
Adder ADD1(a[0],b[0],ci,s[0],co[0]);
Adder ADD2(a[1],b[1],co[0],s[1],co[1]);
Adder ADD3(a[2],b[2],co[1],s[2],co[2]);
Adder ADD4(a[3],b[3],co[2],s[3],s[4]);
endmodule
关于您的测试平台(链接2),您拼错了一些名称:1位地址的名称称为“加法器”,而不是“加法器”。更改定义或实例名称。端口的名称是a,b,cin和s,而不是p,q,ci和r。最后是您将连接到端口的信号(电线)。
由于此加法器的输入数量有限,我建议您进行详尽的测试。因此,不要为a,b和cin探测两个样本值,而是尝试所有可能性,并检查结果是否为预期结果。像这样:
// Code your testbench here
module test_bench;
// Inputs
reg [3:0] p;
reg [3:0] q;
reg ci;
// Outputs
wire [4:0] r;
// Instantiate the Unit Under Test (UUT)
FullAdder uut (
.a(p),
.b(q),
.ci(ci),
.s(r)
);
initial begin
ci = 1'b0;
repeat (2) begin
p = 4'b0000;
repeat (16) begin
q = 4'b0000;
repeat (16) begin
#10;
$display ("%b + %b + %b = %b", p, q, ci, r);
if (r != (p+q+ci)) begin
$display ("ERROR!. Expected %b", p+q+ci);
$finish;
end
#10;
q = q + 1;
end
#10;
p = p + 1;
end
#10;
ci = !ci;
end
$display ("EVERYTHING OK!");
$finish;
end
endmodule