當我正在做作業時,我對reg和wire感到困惑。我無法準確理解reg和wire之間的差異。你能解釋一下嗎?另外,我想知道當我使用output q
而不是output reg q
時會發生什麼?什麼時候應該使用reg而不是電線?
回答
在模擬,一個的Verilog wire
行爲就像一塊金屬,軌道,絲,而一個的Verilog reg
是一個變量,它是存儲*。
他們在模擬中的區別可以通過顯示如果我從多個位置分配給他們來說明。如果我從一個以上的地方分配到wire
,那麼仿真的行爲就好像我將這兩條電線短接在一起。所以,
wire w;
assign w = 1'b1;
assign w = 1'b0;
initial
$display("w= %b", w);
將顯示x
。 w
的值將爲x
,因爲一個assign
正在驅動1'b1
和另一個1'b0
,所以這將使解決到x
。通過這種方式,它正在模擬真實硬件的行爲,其中x
代表未知的值(一個驅動器實際導線驅動值較高,另一個驅動器驅動較低的值實際上未知)。
如果我分配給reg
- 一個變量 - 來自多個地方,我會得到不同的行爲。代替將解析爲x
,reg
將僅取最後指定的任何值。所以,
reg r;
initial
r = 1'b1;
initial
r = 1'b0;
initial
#1 $display("r= %b", r);
將顯示任一1
或0
取決於其初始塊執行最後一個(一些不確定性的)上。
請注意,reg
是由initial
塊驅動的。 A reg
必須由initial
或always
塊(所謂的程序代碼)驅動。假設您正在編寫Verilog,而不是System Verilog,則不能從assign
語句或實例化模塊的輸出分配reg
。所以,如果你想從程序代碼中分配某些東西,你必須使用reg
;如果要從assign
語句或實例化模塊的輸出分配某些內容,則必須是wire
。因此,您是否將output
定義爲reg
或wire
完全取決於您指定的位置。如果你從always
塊中分配給它,它需要是reg
;如果您從assign
語句或實例化模塊的輸出分配給它,則它需要是wire
。
這就是模擬中reg
和wire
行爲的差異。你的合成器將以不同的方式解釋reg
。如果你從一個以上的always
塊(不能合成initial
塊)中分配一個reg
,那麼你的邏輯合成器將合成兩塊硬件,驅動同一塊金屬,軌道,導線,不管 - 你可能不需要的東西 - 不想要。
*那不意味着reg
將合成時必然成爲存儲(即觸發器)。 「reg」變成觸發器還是組合邏輯取決於它是以順序組合式還是組合式總是分配的。
請注意,'reg'不支持存儲如果'always'模塊實現組合邏輯,則總是分配給'reg'。在這種情況下,'reg'就像一個連續分配的'wire',實現相同的功能。順便說一句。如果可能的話,考慮使用SystemVerilog邏輯類型,因爲這會合並'wire'和'reg',因此您不必根據實現來更新聲明。 –
輸出q相當於輸出線q。
reg用於順序邏輯,如觸發器。即使對於組合塊,它也總是需要*塊。 電線用於組合邏輯。
- 1. 什麼時候應該使用AWS,什麼時候不使用
- 2. 什麼時候應該使用async/await,什麼時候不用?
- 3. 什麼時候應該使用INNER-LOOP-JOIN而不是INNER JOIN
- 4. 什麼時候應該使用susy-media而不是susy-breakpoint
- 5. 什麼時候應該使用double而不是小數?
- 6. 什麼時候應該使用UIImagePickerControllerSourceTypePhotoLibrary而不是UIImagePickerControllerSourceTypeSavedPhotosAlbum?
- 7. Python:什麼時候應該使用subprocess.Popen而不是os.popen?
- 8. 什麼時候應該使用ThreadLocal而不是Thread.SetData/Thread.GetData?
- 9. Python:什麼時候應該使用子類而不是方法?
- 10. 什麼時候應該使用fputs而不是fprintf?
- 11. 什麼時候應該使用字符串而不是stringstream?
- 12. 什麼時候應該使用宏而不是內聯函數?
- 13. 什麼時候應該使用的NSKeyedArchiver,而不是SQLite的?
- 14. 什麼時候應該使用angular.component而不是angular.directive?
- 15. Swift:我應該什麼時候使用「var」而不是「let」?
- 16. 什麼時候應該使用Task.Run()而不是等待?
- 17. 什麼時候應該使用Map而不是For循環?
- 18. 什麼時候應該使用UserControl而不是Page?
- 19. 什麼時候應該使用組件而不是指令?
- 20. 什麼時候應該使用ReBuild而不是Build?
- 21. 什麼時候應該使用#ifdef而不是if()?
- 22. 什麼時候應該使用IBOutlet而不是IBAction?
- 23. 什麼時候應該使用OpenStruct而不是哈希?
- 24. 什麼時候應該使用Regex而不是String.IndexOf()?或String.Contains()?
- 25. 什麼時候應該使用HStoreField而不是JSONField?
- 26. 什麼時候應該使用會話變量而不是cookie?
- 27. 什麼是phtml,什麼時候應該使用.phtml擴展名而不是.php?
- 28. 什麼時候應該使用sed,什麼時候應該使用awk
- 29. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 30. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
@Qui我不敢相信這個問題以前沒有問過,但找不到這樣的事情。我發現你提到的問題,並不認爲它是重複的。 –
http://stackoverflow.com/questions/29965504/difference-between-wire-and-reg –
http://stackoverflow.com/questions/33459048/what-is-the-difference-between-reg-and-wire -in-a-verilog-module –