微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > always 进程中的优先级问题

always 进程中的优先级问题

时间:10-02 整理:3721RD 点击:
各位大佬好啊,讨论一个问题代码如下:
第一种情况是使用IF ELSE语句 这样有优先级如下代码:
always  @(posedge clk)
   begin
    if(!rst_n)
    begin
      addr <= 0 ;
     end
  else
    begin
      if(ce1 == 1'b1)
        begin
          addr <= 8'd1 ;
        end
   else if(ce2 == 1'b1)
        begin
          addr <= 8'd2 ;
        end
   else if(ce3 == 1'b1)
        begin
          addr <= 8'd3 ;
        end
   else if(ce4 == 1'b1)
        begin
          addr <= 8'd4 ;
        end
      else if(en == 1'b1)
        begin
          addr <= addr + 8'd1 ;
        end
      else ;
    end  
end
     
endmodule
第二种情况是:在always里面使用几个平行的 if else 代码如下:
always  @(posedge clk)
   begin
    if(!rst_n)
    begin
      addr <= 0 ;
     end
  else
    begin
      if(ce1 == 1'b1)
        begin
          addr <= 8'd1 ;
        end
      else if(en == 1'b1)
        begin
          addr <= addr + 8'd1 ;
        end
      else ;
    end
  
    if(!rst_n)
    begin
      addr <= 0 ;
     end
  else
    begin
      if(ce2 == 1'b1)
        begin
          addr <= 8'd2 ;
        end
      else if(en == 1'b1)
        begin
          addr <= addr + 8'd1 ;
        end
      else ;
    end
  
    if(!rst_n)
    begin
      addr <= 0 ;
     end
  else
    begin
      if(ce3 == 1'b1)
        begin
          addr <= 8'd3 ;
        end
      else if(en == 1'b1)
        begin
          addr <= addr + 8'd1 ;
        end
      else ;
    end
    if(!rst_n)
    begin
      addr <= 0 ;
     end
  else
    begin
      if(ce4 == 1'b1)
        begin
          addr <= 8'd4 ;
        end
      else if(en == 1'b1)
        begin
          addr <= addr + 8'd1 ;
        end
      else ;
    end
  
   end
  
endmodule
请问大虾们这两个情况有何区别,那个更好些。

前一种写法,优先级从高到低依次是:ce1 ce2 ce3 ce4 en
后一种写法,优先级从高到低依次是:ce4 en ce3 ce2 ce1(如果你想问为什么,答案是因为代码是顺序执行的。)
两种写法除了可读性以外,没有好坏的差别。

第二种写法也太那个 啥啥啥 ,第一次见这种写法。



   哈哈 我自己瞎想滴  二楼说的没错 但是第二种写法优先级从高到低应该是:ce1  en  ce2  ce3  ce4



   
    第二种写法优先级从高到低应该是:ce1  en  ce2  ce3  ce4
   既然顺序应该首先是ce1 en  再是ce2 en

##第二种方法可行,但是相当不直观,

第二种写法,因为最后的赋值语句决定了信号的最终值,所以后面的优先级反而高。

第二种写法是只是仿真性的代码,没有实际意义。综合会形成多驱动。



    多谢大虾  看你的分析雾水头清



    应该不会多驱动吧 都在一个进程里面

我还是没有理解第二中

正如8楼所说,第二种没多大实际意义。建议设计中别用。留给大学的老师、研究生写书、写论文用,可以提高大学排名。

综合器是不管程序块的结构的。写在一个always块里与写在多个always块里是等效的。
所谓进程只在仿真器中存在。

第二种与仿真器有关

路过,眼睛都被看晕了

第二种不用else的if由于后面的语句对前面语句有覆盖作用,优先级后面的会更高。
我觉得综合下来的情况可能和不同综合工具有关吧

第二种写法严重不推荐。第一种写法如果各个if的条件互斥的话,有可能综合成没有优先级的电路。

尝试下这种写法,清晰直观,跟第一种效果一样,
不过可能不同编译器结果会不一样
case(1'b1)
ce1: add <= 8'd1;
ce2: add <= 8'd2;
ce3: add <= 8'd3;
ce4: add <= 8'd4;
en : add <= add + 8'd1;
default: add <= add;
endcase

跟软件一个样

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top