verilog程序的一点问题。求救各位大神
module add(a, b, ci, s, co);
input a,b,ci;
output s,co;
reg s,co;
always @(a or bor ci)
begin
s=a^b^ci;
co=a&b+b&ci+a&ci;
end
endmodule
module adder16(a, b, cin, sum, cout);
input[16:1] a;
input[16:1] b;
input cin;
output [16:1]sum;
reg [16:1] sum;
output cout;
reg cout;
reg [16:0] vsum;
reg [16:0] carry;
integer i;
initial
begin
for(i=1;i<=16;i=i+1)
begin
addadder16(.a(a),.b(b),.ci(carry[i-1]),.s(sum),.co(carry));
end
end
always @(a orb or cin)
begin
if(i==1)
vsum[1]=(a[1]^b[1])^cin;
carry[1]=(a[1]&b[1])|(cin&(a[1]|b[1]));
elseif (i>1)
for(i=2;i<=16;i=i+1)
begin
vsum=(a^b)^carry[i-1];
carry=(a&b)|(carry[i-1]&(a|b));
end
end
assignsum=vsum[16];
assigncout=carry[16];
endmodule
写了一个16位全加器的verilog程序。但是编译一直出错。
Error (10663): Verilog HDL Port Connection error at adder16.v(29): output or inout port "s" must be connected to a structural net expression
Error (10663): Verilog HDL Port Connection error at adder16.v(29): output or inout port "co" must be connected to a structural net expression
Error: Can't elaborate top-level user hierarchy
我知道出错是说s 和co 所引用的必须是assign型,用wire。但是下面又有always。改过来这个又在always里报错,必须用reg型。真是不知道应该怎么改了。希望能帮我一下,提出宝贵意见。
小编16位加法器为啥要这么写?
大侠,你是写Gate RTL呢?还是行为RTL。
行为级的。应该怎么修改?
说错了。应该是用RTL 寄存器来描述。
