[转载](转帖)如何使用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)

时间: 2024-12-29 12:51:45

[转载](转帖)如何使用integer型別? (IC Design) (Verilog)的相关文章

1.给栈添加一个获取最小值的方法(元素为Integer型),要求时间复杂度为O(1)

分析:在数据结构与算法中,当要求时间复杂度最小时基本都是要牺牲空间复杂度.栈是先进后出,此处要求用栈实现一个获取最小值的方法且时间复杂度为O(1),首先考虑的方向就是再借助一个栈来实现,这个栈主要用来保存最小值序列(这个地方可以思考一下为什么不能用一个变量来保存最小值). 下面直接附上代码: public class StackMin{ Stack<Integer> stackDate=new Stack<>();//一个普通栈,存入进入栈的元素 Stack<Integer&

struts2框架 转载 精华帖

一.Struts2简介 参考<JavaEE 轻量级框架应用与开发-S2SH> Struts框架是流行广泛的一个MVC开源实现,而Struts2是Struts框架的新一代产品,是将Struts1和WebWork两种技术进行兼容.合并的全新的MVC框架.Struts2框架充分发挥了Struts1和WebWork这两种技术的优势,抛弃原来Struts1的缺点,使得Web开发更加容易. Struts1运行原理:  Struts1工作流程: (1)客户端向Web应用发送请求,请求被核心控制器Action

转载 关于有符号数的加法

先总结一下,做signed运算的步骤1.将每个输入扩展到与输出同样位宽2.运算3.取运算结果的最后几个位宽,位宽大小是输出位宽的大小.为防止溢出,事先应确定好输出位宽的大小. Abstract若要將原本用軟體實現的演算法用硬體電路實現,馬上會遇到2個很基本的問題:一個是如何處理負數?另一個是如何處理overflow?雖然很基本,但一旦有問題卻很難debug. Introduction使用環境:NC-Verilog 5.4 + Debussy 5.4 v9 一般在開發演算法階段,我們會使用C/C+

jsp中遇到Integer的方法valueOf()和parseInt()的区别.前者要求是对象类型,后者是数字型字符串

他们有本质区别,Integer.valueof(String s)是将一个包装类是将一个实际值为数字的变量先转成string型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了. 而Integer.parseInt(String s)只是将是数字的字符串转成数字,注意他返回的是int型变量不具备方法和属性 Integer.parseInt()把String 型转换为Int型, Integer.valueOf()把String 型转换为Integer

【转载】保哥 釐清 CLR、.NET、C#、Visual Studio、ASP.NET 各版本之間的關係

我常常不仅仅逛 博客园,还会去找国外,特别是台湾的技术部落格,发现好的文章,我便会收录,今天我转载或者全文复制,在Google 博客园,一位叫保哥, 釐清 CLR..NET.C#.Visual Studio.ASP.NET各版本之間的關係 文章,转载主要原因,是保哥写得博文很透彻,有技术含量,但是由于某些环境因素影响,在中国大陆访问他的博客园,网络速度一直很慢,有时候还打不开,特别不能忍受这么好博文,没有给更多的读者看到和学习到.所以先转载一篇让大家看看.下面博文内容,请大家支持. 長久以來,我

ColorUtil【Color工具类(color整型、rgb数组、16进制互相转换)】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 主要用于color整型.rgb数组.16进制互相转换(-12590395 <--> #3FE2C5 <--> [63,226,197]) 效果图 暂不需要 代码分析 color的int类型值转16进制类型值包括两种方案: 方案一:思路:计算&16777215的值,然后通过字符串获取16进制数值. /**Color的Int整型转Color的16进制颜色值[方案一] * colorInt - -12590395 * r

[Java] 基本資料包裝類別 Wrapper Classes

基本型別包裝 (Wrapper Classes) 將基本型別生成物件,要將基本型別先包裝成物件,才能執行生成, Boxing: Integer a = new Integer(1) Unboxing: int x = a.intValue() Autoboxing(JDK1.5以後支援) Integer a  = 1  [物 <= 基] ok int x = new Integer(1)    [基 <= 物] ok 獲取其值     xxxValue() % Byte / Short / I

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

json学习之JSONArray的应用(转载)

从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. 1 /** 2 * 从json数组中得到相应java数组 3 * JSONArray下的toArray()方法的使用 4 * @param str 5 * @return 6 */ 7 public static Object[] getJsonToArray(String str) { 8 JSONArray jsonArray = JSONArray.fromObject(str); 9 return