当我正在做作业时,我对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 –