我正在尝试编写一个"逆变器" 2的恭维加法器的功能。我的导师希望我使用if / else语句来实现它。该模块应该采用8位数字并翻转位(零到1/1到零)。我写了这个模块:
module inverter(b, bnot);
input [7:0] b;
output [7:0]bnot;
if (b[0] == 0) begin
assign bnot[0] = 1;
end else begin
assign bnot[0] = 0;
end
//repeat for bits 1-7
当我尝试使用此命令编译和编译时,我收到以下错误:
vcs +v2k inverter.v
Error-[V2005S] Verilog 2005 IEEE 1364-2005 syntax used.
inverter.v, 16
Please compile with -sverilog or -v2005 to support this construct: generate
blocks without generate/endgenerate keywords.
所以我添加了-v2005参数,然后我收到了这个错误:
vcs +v2k -v2005 inverter.v
Elaboration time unknown or bad value encountered for generate if-statement
condition expression.
Please make sure it is elaboration time constant.
有人介意向我解释我做错了什么?所有这一切都很新,而且很困惑:)。谢谢!
答案 0 :(得分:5)
assign
语句声明驱动指定线路的组合硬件。由于你已经把if / else放在它周围,看起来你正在根据需要动态生成硬件,这是你无法做到的。生成语句远离基于常量参数的变量实例的参数化代码,这就是为什么在这种情况下你会得到相当混乱的错误。
两种解决方案:
使用三元运算符选择值。
assign bnot[0] = b[0] ? 1'b0 : 1'b1;
与assign bnot[0] = ~b[0]
相同。
或者使用组合始终阻止,输出必须声明为reg。
module inverter(
input [7:0] b,
output reg [7:0] bnot
);
always @* begin
if (b[0] == 0) begin
bnot[0] = 1;
end else begin
bnot[0] = 0;
end
end
请注意,在上面的示例中,输出声明为reg not wire,我们使用always @ *包装代码,并且不使用assign关键字。
Verliog reg vs wire是一个模拟器优化,您只需要使用正确的模拟器,详细说明的更多答案是Verilog Input Output types,SystemVerilog datatypes。