zoukankan      html  css  js  c++  java
  • [转载](转帖)如何使用integer型別? (IC Design) (Verilog)

    Abstract
    在C/C++或任何程式語言,integer是最常用的型別之一,但在Verilog大部分用的都是wire和reg,很少用到integer,該如何正確地使用integer呢?


    Introduction
    首先,integer和reg與wire最大的差別是,integer本身是個32位元的有號數,含正負。


    實務上,若在RTL中,integer建議只出現於for loop中,用來複製電路,讓程式精簡一些,在其他地方使用這種類型的的變數,容易出現與設計者意料之外的情況[1]。

    如一個4 bit serial in / serial out的shift register
    Verilog / Shift_Register_SISO.v

    10 module Shift_Register_SISO (
    11   iCLK,
    12   iRESET_n,
    13   iSI,
    14   oSO
    15 );
    16 
    17 input iCLK;
    18 input iRESET_n;
    19 input iSI;
    20 output reg oSO;
    21 
    22 reg [3:0] reg4;
    23 
    24 always@(posedge iCLK) begin
    25   if (!iRESET_n) 
    26     reg4 <= 4'h0;
    27   else begin
    28     reg4[0] <= iSI;
    29     reg4[1] <= reg4[0];
    30     reg4[2] <= reg4[1];
    31     reg4[3] <= reg4[2];
    32     oSO     <= reg4[3];
    33   end
    34 end
    35 
    36 endmodule 

    若使用integer配合for loop後,可將程式精簡成
    Verilog / Shift_Register_SISO.v

    10 module Shift_Register_SISO2 (
    11   iCLK,
    12   iRESET_n,
    13   iSI,
    14   oSO
    15 );
    16 
    17 input iCLK;
    18 input iRESET_n;
    19 input iSI;
    20 output reg oSO;
    21 
    22 reg [3:0] reg4;
    23 
    24 always@(posedge iCLK) begin
    25   integer i;
    26   
    27   if (!iRESET_n) 
    28     reg4 <= 4'h0;
    29   else begin
    30     
    31     reg4[0] <= iSI;
    32     
    33     for(i = 0; i < 3; i = i + 1) 
    34       reg4[i+1] <= reg4[i];
    35       
    36     oSO <= reg4[3];
    37   end
    38 end
    39 
    40 endmodule

    原來的29 ~ 31行

    reg4[1] <= reg4[0];
    reg4[2] <= reg4[1];
    reg4[3] <= reg4[2];


    最後精簡成

    for(i = 0; i < 3; i = i + 1) 
      reg4[i+1] <= reg4[i];    


    這兩個程式將來合成出來的硬體電路完全一樣,只是程式比較精簡些,適合用來複製電路。

    另外一個初學者常疏忽的地方,原本想設計一個8位元的計數器,因為使用了integer卻得到一個32位元計數器,除了引起設計錯誤,也耗用了更多的資源。[1]

    1 integer counter;
    2 
    3 always@(posedge clk) begin
    4   if (counter < 200)
    5     counter <= counter + 1;
    6   else
    7     counter <= 0;
    8 end

    應該改成

    1 reg[7:0] counter;
    2 
    3 always@(posedge clk) begin
    4   if (counter < 200)
    5     counter <= counter + 1;
    6   else
    7     counter <= 0;
    8 end 

    Conclusion
    在RTL中,建議integer只配合for loop使用來複製電路,其他都應該使用wire或reg。

    See Also
    (原創) wire與reg的差異? (初級) (IC Design) (Verilog)

  • 相关阅读:
    linux系统空间不足,不重启进程,清理僵尸文件。
    python练习-使用163邮箱发送邮件
    python练习-(秒转时分秒,时分秒转秒)-对比linux中文件的上次更改时间跟当前时间相差多久。
    CentOS7 docker开启tcp端口并进行客户端远程连接
    zabbix 定义触发器,并使用邮件,微信消息报警。
    zabbix自定义监控,自定义图表。
    如何在linux中发送邮件,使用163邮箱发信。
    ansible-playbook的YAML语法学习
    将已有项目导入Gitlab
    ubuntu python PyCharm virtualenv
  • 原文地址:https://www.cnblogs.com/yulone/p/4058664.html
Copyright © 2011-2022 走看看