[Synth 8-196] conditional expression could not be resolved to a constant

[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

四、仿真图

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值