Почему размер порта здесь не совпадает в Verilog (16-битный CarrySelectAdder)? - PullRequest
0 голосов
/ 22 марта 2020

Здесь я создаю 16-битный CarrySelectAdder

Вот файл сумматора:

module multiplexer2x1_4 (X, I0, I1, S);
   output [3:0] X;   
   input [3:0]  I1;  
   input [3:0]  I0;  
   input S; 
   assign X = (S == 1'b0) ? I0 : I1;
endmodule

module multiplexer2x1_1 (X, I0, I1, S);
   output X;   
   input I1;  
   input I0;  
   input S; 
   assign X = (S == 1'b0) ? I0 : I1;
endmodule

module halfAdder(S,Cout,A,B);
    output S;
    output Cout;
    input A;
    input B;
    xor(S,A,B);
    and(Cout,A,B);
endmodule

module fullAdder(S, Cout, A, B, Cin);
   output S;
   output Cout;
   input  A;
   input  B;
   input  Cin;
   wire   C1;
   wire   C2;
   wire   S1;
   halfAdder h1 (S1,C1,A,B);
   halfAdder h2 (S,C2,S1,Cin);     
   or(Cout, C1, C2);
endmodule 

module rippleCarryAdder(S, C, A, B, Cin);
   output [3:0] S;
   output   C; 
   input [3:0]  A; 
   input [3:0]  B; 
   input    Cin; 

   wire     C0;
   wire     C1;
   wire     C2;

   fullAdder f0(S[0], C0, A[0], B[0], Cin);
   fullAdder f1(S[1], C1, A[1], B[1], C0);
   fullAdder f2(S[2], C2, A[2], B[2], C1);
   fullAdder f3(S[3], C, A[3], B[3], C2);  
endmodule



module carrySelectAdder(S, C, A, B);
   output [15:0] S;  
   output   C;  
   input [15:0]     A;  
   input [15:0]     B; 

   wire [11:0]  S0; 
   wire [11:0]  S1; 

   wire     C0;   
   wire     C1;  
   wire     C2; 
   wire     C3; 
   wire     C4; 
   wire     C5;  
   wire     C6; 
   wire     C7; 
   wire     C8; 

   rippleCarryAdder R1 (S[3:0], C0, A[3:0], B[3:0], 0);

   rippleCarryAdder R2_1 (S0[3:0], C1, A[7:4], B[7:4], 0);     
   rippleCarryAdder R2_2 (S1[3:0], C2, A[7:4], B[7:4], 1);     
   multiplexer2x1_4 mux2 (S[7:4], S0[3:0], S1[3:0], C0);  

   multiplexer2x1_1 mc2 (C3,C1,C2,C0);

   rippleCarryAdder R3_1 (S0[7:4], C4, A[11:8], B[11:8], 0);     
   rippleCarryAdder R3_2 (S1[7:4], C5, A[11:8], B[11:8], 1);     
   multiplexer2x1_4 mux3 (S[11:8], S0[11:8], S1[11:8], C3);  

   multiplexer2x1_1 mc3 (C6,C4,C5,C3);

   rippleCarryAdder R4_1 (S0[11:8], C7, A[15:12], B[15:12], 0);     
   rippleCarryAdder R4_2 (S1[11:8], C8, A[15:12], B[15:12], 1);     
   multiplexer2x1_4 mux4 (S[15:12], S0[11:8], S1[11:8], C6);

   multiplexer2x1_1 mc4 (C,C7,C8,C6);

endmodule

, и это тестовый стенд:

module carrySelectAdder_testBench;
reg [15:0] a;
reg [15:0] b;
wire [15:0] sum;
wire carry;
  carrySelectAdder sl (sum[15:0],carry,a[15:0],b[15:0]);
initial 
begin
$monitor("%b \t %b",sum,carry);
assign a = 16'b1001010110010101;
assign b = 16'b1001010111110101;
$finish;
end
endmodule

it выдает ошибку соответствия размеров в порту 5 в rippleCarryAdder. Что не так?

design.sv: L78: предупреждение: размеры портов не совпадают в порту № 5 design.sv: L80: предупреждение : Размеры порта не совпадают в порту № 5 design.sv: L81: предупреждение: размеры порта не совпадают в порту № 5 design.sv: L86: предупреждение: размеры порта не совпадают в порту № 5 design.sv : L87: предупреждение: размеры порта не совпадают в дизайне порта № 5..s.s: L92: предупреждение: размеры порта не совпадают в дизайне порта № 5. L93: предупреждение: размеры порта не совпадают в порту #. 5

1 Ответ

2 голосов
/ 22 марта 2020

Проблема в том, что вы связали входной порт вашего rippleCarryAdder экземпляра с 0 вместо 1'b0.

0 - это нестандартное литеральное число константы , означающее, что вы не определили битовую ширину этой константы. Рассматривая раздел 5.7.1 (целочисленные литеральные константы) SystemVerilog LRM , мы обнаруживаем, что:

Количество бит, составляющих число без размера (которое является простым десятичным числом или числом с базовым спецификатором, но без указания размера) должно быть не менее 32 . Безразмерные литеральные константы без знака, в которых старший бит неизвестен (X или x) или состоит из трех состояний (Z или z), должны быть расширены до размера выражения, содержащего буквальную константу.

Следовательно компилятор интерпретирует ваш RTL, как если бы вы подключили 32-битную (или более) константу к 1-битному входному порту rippleCarryAdder.

...