在"内使用非常数值,而#34;,给我这个错误,我该怎么办?

时间:2016-01-30 08:56:14

标签: math verilog synthesis quartus

我试图加减浮点数。我的指南是一本书"计算机算术和Verilog HDL基础知识"通过Cavanagh。在模块内部,他使用代码来对齐指数,如下所示。

  always @ (oper_1 or oper_2)
  begin 


  exp_a = oper_1 [31:24];
  exp_b = oper_2 [31:24];


  fract_a = oper_1 [23:0];
  fract_b = oper_2 [23:0];


  // bias exponents 


  exp_a_bias = exp_a + 8'b0111_1111;
  exp_b_bias = exp_b + 8'b0111_1111;


 // align fractions 


 if (exp_a_bias < exp_b_bias)
 ctrl_align = exp_b_bias - exp_a_bias;

 while (ctrl_align)
 begin
 fract_a = fract_a >> 1;
 exp_a_bias = exp_a_bias + 1;
 ctrl_align = ctrl_align - 1;
 end


  if (exp_b_bias < exp_a_bias)
  ctrl_align = exp_a_bias - exp_b_bias;

  while (ctrl_align)  // heres comes the troubles
  begin
  fract_b = fract_b >> 1;
  exp_b_bias = exp_b_bias + 1;
  ctrl_align = ctrl_align - 1;
  end

Quartus II给出了以下错误:

错误(10119):ADD_SUB_FLO.v(40)处的Verilog HDL循环语句错误:具有非常量循环条件的循环必须在250次迭代内终止

我搜索过,似乎因为Quartus无法确定&#34; ctrl_align&#34;的大小。结果它不会合成。 Quartus网站说我可以编辑.qsf文件,但我无法在我的文件中找到任何

set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 300

此外,我在某种程度上留下了深刻的印象,这本书用错误的代码教导了这一步,而不是同义词,我也希望实际上解决问题而不是解决方法,我该怎么办?

更新:我尝试更改为&#39; For&#39;但它给出了错误: 错误(10170):在文本&#34;&gt;&#34;附近的ADD_SUB_FLO.v(44)处的Verilog HDL语法错误;期待&#34; =&#34; 我认为,或者它不重要,因为它似乎问题是系统需要预先知道界限,但是要计算它。

    for ( i=ctrl_align,i>0,i=i-1)
        begin
            fract_a = fract_a >> 1;
            exp_a_bias = exp_a_bias + 1;
        end

1 个答案:

答案 0 :(得分:1)

正如先前的评论所述,这不是可合成的Verilog。你在顺序思考中陷入了困境。您不需要for循环或while循环,基本上,您希望fract_*移位,exp_*_bias递增,ctrl_align在初始加载后递减。

有三种状态:

  1. 加载状态,其中ctrl_align = exp_b_bias - exp_a_bias
  2. 计数状态,其中ctrl_align递减并且正确fract_已移位
  3. 完成状态,其中ctr_align == 0且输出有效
  4. 使用简单的状态机来跟踪此情况,然后使用case语句为每个网络选择正确的分配。

    例如:

    always @(posedge clk) begin
        // Should include a reset
        case(state):
        LOAD:begin
            ctr_align <= (exp_a_bias < exp_b_bias)? exp_b_bias - exp_a_bias : exp_a_bias - exp_b_bias;
        end
        COUNT:begin
            ctrl_align <= ctrl_align - 8'd1;
            fract_a <= (exp_a_bias < exp_b_bias)? fract_a >> 1 : fract_a;
            fract_b <= (exp_b_bias < exp_a_bias)? fract_b >> 1 : fract_b;
        end
        DONE: ctrl_align <= ctrl_align
        default: ctrl_align <= 0; // latches inferred for fract_*
    

    Haven没有检查语法,还有一些推断的锁存器,但这应该给你一个要点。状态机应该很容易实现,只需要几个if语句。

    希望有所帮助!