Verilog If语句 - 信号不是常量

时间:2017-11-26 11:16:24

标签: verilog

我只是想在Verilog中执行一个简单的If - Else语句但不知何故它不起作用

module my_mod(A,B,C);
input [3:0] A; 
input [3:0] B; 
output [4:0] C;

if(A>B)
assign C=A;
else
assign C=B;

endmodule;

以下是错误消息:

 "xvlog -m64 --relax -prj adder_tb_vlog.prj"
INFO: [VRFC 10-2263] Analyzing Verilog file "F:/Verilogcodes/Sources/my_adder.v" into library xil_defaultlib
INFO: [VRFC 10-311] analyzing module my_mod
ERROR: [VRFC 10-60] A is not a constant [F:/Verilogcodes/Sources/my_adder.v:6]
ERROR: [VRFC 10-1040] module my_mod ignored due to previous errors [F:/Verilogcodes/Sources/my_adder.v:1]
WARNING: [VRFC 10-2502] extra semicolon in $unit (global) scope [F:/Verilogcodes/Sources/my_adder.v:11]

我确信它与帖子有关 - "<signal> is not a constant" error in if-statement。但我觉得很难找出为什么if语句中的赋值语句不起作用的确切逻辑。关于上述代码无效的任何帮助/建议都会有所帮助。

1 个答案:

答案 0 :(得分:1)

程序上下文之外的if/case/for语句是generate构造。参见1800-2012 LRM的第27节。这些构造必须具有常量表达式,因为它们将在编译时优化

您可以通过将输出变为变量,将连续分配转换为简单分配。然后将代码移到always块中。

module my_mod(
input wire [3:0] A, 
input wire [3:0] B, 
output reg [4:0] C);

always @(*) if(A>B) begin
  C=A;
end else begin
  C=B;
end
endmodule;