bstract
在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
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
若使用integer配合for loop後,可將程式精簡成
Verilog / Shift_Register_SISO.v
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
原來的29 ~ 31行
reg4[ 2]
reg4[ 3]
最後精簡成
這兩個程式將來合成出來的硬體電路完全一樣,只是程式比較精簡些,適合用來複製電路。
另外一個初學者常疏忽的地方,原本想設計一個8位元的計數器,因為使用了integer卻得到一個32位元計數器,除了引起設計錯誤,也耗用了更多的資源。[1]
2
3
4
5
6
7
8
應該改成
2
3
4
5
6
7
8
Conclusion
在RTL中,建議integer只配合for loop使用來複製電路,其他都應該使用wire或reg。
See Also
(原創) wire與reg的差異? (初級) (IC Design) (Verilog)
上面的转载的,integer 类型可以在=赋值,在always块中可以同时使用《=赋值。》