[Synth 8-196] conditional expression could not be resolved to a constant [Synth 8-196]条件表达式不能解析为常量
一、循环加功能代码
做一个循环加的实验的时候,实现a的低4位,分别加上b寄存器按照4位划分的数据,在仿真顶层模块的时候出错,错误就如下所示:
[Synth 8-196] conditional expression could not be resolved to a constant
//[Synth 8-196]条件表达式不能解析为常量
它说我这个信号不能用作输出端口,检查了很久,我才发现我犯了一个非常低级的错误,即在顶层定义的时候,我将s(出问题的信号)的变量类型设为reg了,也就是我是s这个信号的,这样做是错误的,虽然需要存储值,但是组合逻辑中应该用wire,然后再我改过来之后,就可以仿真成功啦!
错误代码
module fortest(a,b,s);
input [15:0]a;
input [15:0]b;
output reg [15:0]s;
wire [3:0]d;
REDADD_4BIT REDADD_4BIT_inst (
.o_s(s[3:0]),
.o_c(),
.i_a(a[3:0]),
.i_b(b[3:0]),
.i_cin(1'b0)
);
genvar i_var;
generate
for(i_var=0;i_var<3;i_var=i_var+1)begin
// $display ("Current loop#%0d",i);
REDADD_4BIT REDADD_4BIT_inst (
.o_s(s[(i_var+1)*4+3:(i_var+1)*4]),
.o_c(),
.i_a(a[(i_var+1)*4+3:(i_var+1)*4]),
.i_b(s[i_var*4+3:i_var*4]),
.i_cin(1'b0)
);
assign d=s[15:12];
end
endgenerate
endmodule
正确代码
module fortest(a,b,s);
input [15:0]a;
input [15:0]b;
output [15:0]s;
wire [3:0]d;
REDADD_4BIT REDADD_4BIT_inst (
.o_s(s[3:0]),
.o_c(),
.i_a(a[3:0]),
.i_b(b[3:0]),
.i_cin(1'b0)
);
genvar i_var;
generate
for(i_var=0;i_var<3;i_var=i_var+1)begin
// $display ("Current loop#%0d",i);
REDADD_4BIT REDADD_4BIT_inst (
.o_s(s[(i_var+1)*4+3:(i_var+1)*4]),
.o_c(),
.i_a(a[(i_var+1)*4+3:(i_var+1)*4]),
.i_b(s[i_var*4+3:i_var*4]),
.i_cin(1'b0)
);
assign d=s[15:12];
end
endgenerate
endmodule
二、4位加法器代码
module REDADD_4BIT (o_s,o_c,i_a,i_b,i_cin);
output[3:0] o_s;
output o_c;
input[3:0] i_a;
input[3:0] i_b;
input i_cin;
wire[3:0] c_p;
wire[3:0] c_g;
reg [3:0] c_ci;
assign c_p =i_a^i_b;
assign c_g =i_a&i_b;
always @*
begin
c_ci[0]=i_cin;
c_ci[1]=c_g[0] | c_p[0]&i_cin;
c_ci[2]=c_g[1] | c_p[1]&c_g[0] | c_p[1]&c_p[0]&i_cin;
c_ci[3]=c_g[2] | c_p[2]&c_g[1] | c_p[2]&c_p[1]&c_g[0] | c_p[2]&c_p[1]&c_p[0]&i_cin;
end
assign o_s =c_p^c_ci;
assign o_c =c_g[3] | c_p[3]&c_ci[3];
endmodule
三、仿真代码
module fortest_tb( );
reg [15:0]a;
reg [15:0]b;
wire [15:0]s;
fortest fortest_inst(
.a(a),
.b(b),
.s(s)
);
initial begin
a = 16'b0;
b = 16'b0;
#100
a = 16'b0101_0001_0001_0111;
b = 16'b0101_0001_0001_0111;
end
endmodule