首页 > 解决方案 > 端口尺寸 (8) 与端口“A”的连接尺寸 (4) 不匹配

问题描述

谁能用这个测试台解决我的问题?它总是给我 Zsout0sout1,我不得不提到,在模拟过程中,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

标签: verilog

解决方案


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 显示括号是强制性的;我很惊讶我们的模拟器没有产生编译错误。


推荐阅读