我正在制作一个8位选择加法器和4位加法器。
当我试着测试这段代码时。
i got a 2 error.
第一个是"coutL不是常量">
第二个是"目标的并发分配或输出端口
连接应该是net类型。">
有人能帮我吗?
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*);
begin
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
end
endmodule
下面的语句后面加上分号是没有意义的:
always @ (*);
我猜下面的begin
..end
打算使用之前的always块。他们没有,因为分号。在任何情况下,在这样的块中实例化模块在verilog中是非法的,它应该在块之外和begin/end:
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
在现代verilog中,独立的begin/end语句和if
语句都代表一个generate
块。因此,以下是生成块的一部分:
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
但是这样的块只能操作常量。所以countL
一定是常数,也就是parameter
。这是一个reg,因此,有一个错误。
再次,您似乎打算将其作为always块的一部分。在这样一个块中的assign
语句是一种非常特殊的verilog结构,在没有很好地理解它们的作用之前,不应该使用它们。
我的猜测是您的意图如下:
module selectAdd8(
input [7:0] a,
input [7:0] b,
input cin,
output reg [7:0] sum,
output reg cout
);
reg coutL, sumL, sum0, sum1, cout0, cout1;
always @ (*)
begin
if (coutL==1) begin
sum = {sum1, sumL};
cout = cout1;
end else begin
sum = {sum0, sumL};
cout = cout0;
end
end
add4 add_lower(a[3:0],b[3:0],cin,sumL,coutL);
add4 add4_0(a[7:4],b[7:4],0,sum0,cout0);
add4 add4_1(a[7:4],b[7:4],1,sum1,cout1);
endmodule