天天看點

Verilog 中的for語句

    在C語言中,經常用到for循環語句,但在硬體描述語言中for語句的使用較C語言等軟體描述語言有較大的差別。

     在Verilog中除了在Testbench(仿真測試激勵)中使用for循環語句外,在Testbench中for語句在生成激勵信号等方面使用較普遍,但在RTL級編碼中卻很少使用for循環語句。主要原因就是for循環會被綜合器展開為所有變量情況的執行語句,每個變量獨立占用寄存器資源,每條執行語句并不能有效地複用硬體邏輯資源,造成巨大的資源浪費。簡單的說就是:for語句循環幾次,就是将相同的電路複制幾次,是以循環次數越多,占用面積越大,綜合就越慢。

     在RTL硬體描述中,遇到類似的算法,推薦的方法是先搞清楚設計的時序要求,做一個reg型計數器。在每個時鐘沿累加,并在每個時鐘沿判斷計數器情況,做相應的處理,能複用的處理子產品盡量複用,即使所有的操作不能複用,也采用case語句展開處理。

對于下面的for循環語句:

for(i=0;i<16;i++)
  DoSomething();
           

可以采用如下代碼實作:

reg [3:0] counter;
always @(posedge clk)
  if(syn_rst)
    counter<=4'b0;
  else
    counter<=counter+1;
always @(posedge clk)
  begin
    case(counter)
        4'b0000:
        4'b0001:
        ......
    default:
    endcase
  end
           

     另外,有幾個文法的細節需要注意一下。for(i=0;i<16;i=i+1)中的i既可以是reg型的變量也可以是integer類型的變量,但是當i是reg型的變量時,需要注意因為判斷語句i<16的緣故,i應定義為reg[4:0] i而不是reg[3:0] i 。由于verilog中沒有自增運算符,文中提到的for語句不能寫成for(i=0;i<16; i++)的形式。