verilog - 端口尺寸 (8) 与端口“A”的连接尺寸 (4) 不匹配
问题描述
谁能用这个测试台解决我的问题?它总是给我 Zsout0
和sout1
,我不得不提到,在模拟过程中,Modelsim 显示了一些警告。
试验台:
`timescale 1ns/1ns
module NMA_TB();
wire cout;
wire [3:0]sout0;
wire [3:0]sout1;
reg [3:0] a, b;
reg cin;
NMA #3 nma(a,b, cin, sout0,sout1,cout);
initial begin
#5 cin = 1;
#0 a = 8'b11111111;
#0 b = 8'b11111111;
#500
#0 a = 8'b00000011;
#0 b = 8'b00000011;
#500
#0 a = 8'b11000000;
#0 b = 8'b10000000;
#500 $stop;
end
endmodule
NMA verilog:
`include "TMA.v"
`timescale 1ns/1ns
module NMA #(parameter n = 3)(input [n+n+1 : 0] A, input [n+n+1 : 0] B, input carry_in, output [n:0] sum_out0, [n:0] sum_out1, carry_out);
wire [n : 0] w1;
wire [n : 0] s0;
wire [n : 0] s1;
assign w1[0] = carry_in;
assign carry_out = w1[(n-1)/2];
genvar k;
generate
for(k = 0; k < n; k=k+1) begin : NMA_gates
TMA tma(A[k+k], B[k+k], A[k+k+1], B[k+k+1], w1[k], s0[k], s1[k], w1[k+1]);
end
endgenerate
endmodule
TMA(基于两位多路复用器的加法器)verilog:
`timescale 1ns/1ns
module TMA(input a0, b0, a1, b1,cin, output sum0, sum1,cout);
wire cout0;
assign #45 sum0= a0 ? (b0 ? cin : ~cin) : (b0 ? ~cin : cin);
assign #45 cout0= a0 ? (b0 ? 1 : cin) : (b0 ? cin : 0);
assign #45 sum1=a1 ? (b1 ? cout0 : ~cout0) : (b1 ? ~cout0 : cout0);
assign #45 cout=a1 ? (b1 ? 1 : cout0) : (b1 ? cout0 : 0);
endmodule
警告是:
警告:(vsim-3015) [PCDPC] - 端口大小 (8) 与端口“A”的连接大小 (4) 不匹配。端口定义位于:C:/Users/AliZ/Desktop/CA3/NMA.v(3)。
时间:0 ns 迭代:0 实例:/NMA_TB/nma 文件:C:/Users/AliZ/Desktop/CA3/NMA_N_TB.v 行:8 警告:(vsim-3015) [PCDPC] - 端口大小 (8) 不匹配端口“B”的连接尺寸 (4)。端口定义位于:C:/Users/AliZ/Desktop/CA3/NMA.v(3)。
时间:0 ns 迭代:0 实例:/NMA_TB/nma 文件:C:/Users/AliZ/Desktop/CA3/NMA_N_TB.v 行:8 警告:(vsim-3015) [PCDPC] - 端口大小 (4) 不匹配端口“carry_out”的连接大小 (1)。端口定义位于:C:/Users/AliZ/Desktop/CA3/NMA.v(3)。
时间:0 ns 迭代:0 实例:/NMA_TB/nma 文件:C:/Users/AliZ/Desktop/CA3/NMA_N_TB.v 行:8
解决方案
sum_out0
并且在模块sum_out1
中是未驱动的。NMA
您将它们声明为output
端口,但您没有对它们进行分配。
这些更改修复了编译警告并摆脱了 Z onsout1[2:0]
和sout0[2:0]
. 请参阅标有 的行////
:
module NMA_TB();
wire cout;
wire [3:0]sout0;
wire [3:0]sout1;
reg [7:0] a, b; ////
reg cin;
NMA #3 nma(a,b, cin, sout0,sout1,cout);
initial begin
#5 cin = 1;
#0 a = 8'b11111111;
#0 b = 8'b11111111;
#500
#0 a = 8'b00000011;
#0 b = 8'b00000011;
#500
#0 a = 8'b11000000;
#0 b = 8'b10000000;
#500 $stop;
end
endmodule
module NMA #(parameter n = 3)(input [n+n+1 : 0] A, input [n+n+1 : 0] B, input carry_in, output [n:0] sum_out0, [n:0] sum_out1, output carry_out); ////
wire [n : 0] w1;
wire [n : 0] s0;
wire [n : 0] s1;
assign sum_out0 = s0; ////
assign sum_out1 = s1; ////
assign w1[0] = carry_in;
assign carry_out = w1[(n-1)/2];
genvar k;
generate
for(k = 0; k < n; k=k+1) begin : NMA_gates
TMA tma(A[k+k], B[k+k], A[k+k+1], B[k+k+1], w1[k], s0[k], s1[k], w1[k+1]);
end
endgenerate
endmodule
sout0[3]
仍然是 Z,但你需要弄清楚它应该如何驱动。
顺便说一句,您可能应该使用以下语法(括号括起来3
):
NMA #(3) nma(a,b, cin, sout0,sout1,cout);
IEEE Std 1800-2017 显示括号是强制性的;我很惊讶我们的模拟器没有产生编译错误。
推荐阅读
- apollo - Apollo 客户端查询编排
- javascript - 在 http.get 请求后在客户端呈现时,字典键大小写转换为小写
- firebase - 使用 laravel 无法在移动设备上获取推送通知
- python - 如何从 SQL 或 Python 中的 ```grep``` 模拟 ```WHERE``` 以迭代和更改具有某些属性的数据?
- c# - 在 C# COM 项目中,我应该引用 DLL 还是 TLB?(主要是SolidWorks)
- java - 如何在 REST 服务中进行分页?
- android - 应用程序在模拟器上运行良好,但在没有任何 ANR 的情况下迷恋 OnePlus 设备。刚刚显示 - 访问被拒绝查找属性“sys.thermal.para”
- excel - 在值变化时动态运行宏|VBA|Excel|
- biztalk - %MessageID% 与 BTS.MessageID 不同
- c - 如何在arm-none-eabi中编译以__asm开头的C函数?