2016-04-10 50 views
0

当我正在做作业时,我对reg和wire感到困惑。我无法准确理解reg和wire之间的差异。你能解释一下吗?另外,我想知道当我使用output q而不是output reg q时会发生什么?什么时候应该使用reg而不是电线?

+0

@Qui我不敢相信这个问题以前没有问过,但找不到这样的事情。我发现你提到的问题,并不认为它是重复的。 –

+1

http://stackoverflow.com/questions/29965504/difference-between-wire-and-reg –

+1

http://stackoverflow.com/questions/33459048/what-is-the-difference-between-reg-and-wire -in-a-verilog-module –

回答

2

模拟,一个的Verilog wire行为就像一块金属,轨道,丝,而一个的Verilog reg是一个变量,它是存储*。

他们在模拟中的区别可以通过显示如果我从多个位置分配给他们来说明。如果我从一个以上的地方分配到wire,那么仿真的行为就好像我将这两条电线短接在一起。所以,

wire w; 
assign w = 1'b1; 
assign w = 1'b0; 
initial 
    $display("w= %b", w); 

将显示xw的值将为x,因为一个assign正在驱动1'b1和另一个1'b0,所以这将使解决x。通过这种方式,它正在模拟真实硬件的行为,其中x代表未知的值(一个驱动器实际导线驱动值较高,另一个驱动器驱动较低的值实际上未知)。

如果我分配给reg - 一个变量 - 来自多个地方,我会得到不同的行为。代替解析为xreg将仅取最后指定的任何值。所以,

reg r; 

initial 
    r = 1'b1; 

initial 
    r = 1'b0; 

initial 
    #1 $display("r= %b", r); 

将显示任一10取决于其初始块执行最后一个(一些不确定性的)上。

请注意,reg是由initial块驱动的。 A reg必须由initialalways块(所谓的程序代码)驱动。假设您正在编写Verilog,而不是System Verilog,则不能从assign语句或实例化模块的输出分配reg。所以,如果你想从程序代码中分配某些东西,你必须使用reg;如果要从assign语句或实例化模块的输出分配某些内容,则必须是wire因此,您是否将output定义为regwire完全取决于您指定的位置。如果你从always块中分配给它,它需要是reg;如果您从assign语句或实例化模块的输出分配给它,则它需要是wire

这就是模拟中regwire行为的差异。你的合成器将以不同的方式解释reg。如果你从一个以上的always块(不能合成initial块)中分配一个reg,那么你的逻辑合成器将合成两块硬件,驱动同一块金属,轨道,导线,不管 - 你可能不需要的东西 - 不想要。

*那意味着reg将合成时必然成为存储(即触发器)。 “reg”变成触发器还是组合逻辑取决于它是以顺序组合式还是组合式总是分配的。

+1

请注意,'reg'不支持存储如果'always'模块实现组合逻辑,则总是分配给'reg'。在这种情况下,'reg'就像一个连续分配的'wire',实现相同的功能。顺便说一句。如果可能的话,考虑使用SystemVerilog逻辑类型,因为这会合并'wire'和'reg',因此您不必根据实现来更新声明。 –

0

输出q相当于输出线q。

reg用于顺序逻辑,如触发器。即使对于组合块,它也总是需要*块。 电线用于组合逻辑。

相关问题