本文介绍了IF语句中出现Verilog错误。(REG)不是常量。并发分配或输出端口连接的目标<;reg>;应为网络类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在用4位加法器制作8位选择加法器。
当我尝试测试此代码时。
我收到%2错误。
第一个是";coutL不是常量
第二个是并发分配或输出端口的目标(&Q;)
连接应为网络类型。&Quot;
有人能帮我吗?
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
计划与以前的始终挡路一起使用。因为分号的缘故,他们没有这样做。在任何情况下,在这样的挡路内实例化模块在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);
独立BEGIN/END和if
语句都表示现代Verilog中的generate
挡路。下面是生成挡路的一部分:
if (coutL==1) begin
assign sum = {sum1, sumL};
assign cout = cout1;
end else begin
assign sum = {sum0, sumL};
assign cout = cout0;
end
但这样的块只使用常量操作。因此countL
必须是常量,即aparameter
。这是注册表,因此存在错误。
再次声明,您似乎打算将其作为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
这篇关于IF语句中出现Verilog错误。(REG)不是常量。并发分配或输出端口连接的目标<;reg>;应为网络类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!