我只是想在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语句中的赋值语句不起作用的确切逻辑。关于上述代码无效的任何帮助/建议都会有所帮助。
答案 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;