我正在尝试为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
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此命令编译和编译时,我收到以下错误:
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.
Run Code Online (Sandbox Code Playgroud)
所以我添加了-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.
Run Code Online (Sandbox Code Playgroud)
有人介意向我解释我做错了什么?所有这一切都很新,而且很困惑:).谢谢!
assign像这样的语句声明驱动指定线路的组合硬件.由于你已经把if/else放在它周围,看起来你正在根据需要动态生成硬件,这是你无法做到的.生成语句远离基于常量参数的变量实例的参数化代码,这就是为什么在这种情况下你会得到相当混乱的错误.
两种解决方案
使用三元运算符选择值.
assign bnot[0] = b[0] ? 1'b0 : 1'b1;
Run Code Online (Sandbox Code Playgroud)
哪个是一样的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
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的示例中,输出声明为reg not wire,我们使用always @*包装代码,并且不使用assign关键字.
Verliog reg vs wire是一个模拟器优化,你只需要使用正确的,进一步的答案,详细说明这是Verilog输入输出类型,SystemVerilog数据类型.