logo资料库

Verilog中-reg和wire-用法和区别以及always和assign的区别.pdf

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
1、从仿真角度来说,HDL语言面对的是编译器,相当于使 用软件思路,此时: wire对应于连续赋值,如assign; reg对应于过程赋值,如always,initial; 2、从综合角度,HDL语言面对的是综合器,相当于从电路 角度来思考,此时: wire型变量综合出来一般情况下是一根导线。 reg变量在always中有两种情况: (1)always @(a or b or c)形式的,即不 带时钟边沿的,综合出来还是组合逻辑; (2)always @(posedge clk)形式的,即带 有边沿的,综合出来一般是时序逻辑,会包含触发器 (Flip-Flop) 3、设计中,输入信号一般来说不能判断出上一级是寄存 器输出还是组合逻辑输出,对于本级来说,就当成一根导 线,即wire型。而输出信号则由自己来决定是reg还是组 合逻辑输出,wire和reg型都可以。但一般的,整个设计 的外部输出(即最顶层模块的输出),要求是reg输出, 这比较稳定、扇出能力好。 4、Verilog中何时要定义成wire型?
情况一:assign语句 例如: reg a,b; wire out; ...... assign out = a & b; 如果把out定义成reg型,对不起,编译器报错! 情况二:元件实例化时必须用wire型 例如: wire dout; ram u_ram ( .... .out(dout); ) wire为无逻辑连线,wire本身不带逻辑性,所以输 入什么就的输出什么。所以如果用always语句对wire变量 赋值,对不起,编译器报错。 那么你可能会问, assign c = a & b; 不 是对wire的赋值吗? 并非如此,综合时是将 a & b综合成 a、b经过一 个与门,而c是连接到与门输出线,真正综合出来的是与
门&,不是c。 5、何时用reg、何时用wire? 大体来说,reg和wire类似于C、C++的变量,但若此 变量要放在begin...end之内,则该变量只能是reg型;在 begin...end之外,则用wire型; 使用wire型时,必须搭配assign;reg型可以不用。 input、output、inout预设值都是wire型。 在Verilog中使用reg型,并不表示综合出来就是暂 存器register:在组合电路中使用reg,组合后只是net; 在时序电路中使用reg,合成后才是以Flip-Flop形式表示 的register触发器。 6、reg和wire的区别: reg型数据保持最后一次的赋值,而wire型数据需要 持续的驱动。wire用在连续赋值语句assign中;reg用于 always过程赋值语句中。 在连续赋值语句assign中,表达式右侧的计算结果可 以立即更新到表达式的左侧,可以理解为逻辑之后直接连 接了一条线,这个逻辑对应于表达式的右侧,这条线对应 于wire; 在过程赋值语句中,表达式右侧的计算结果在某种 条件的触发下放到一个变量当中,这个变量可以声明成
reg型,根据触发条件的不同,过程语句可以建模不同的 硬件结构: (1)如果这个条件是时钟上升沿或下降沿,那硬件 模型就是一个触发器,只有是指定了always@(posedge or negedge)才是触发器。 (2)如果这个条件是某一信号的高低电平,那这个 硬件模型就是一个锁存器。 (3)如果这个条件是赋值语句右侧任意操作数的变 化,那这个硬件模型就是一个组合逻辑。 7、过程赋值语句always@和连续赋值语句assign的区别: (1)wire型用于assign的赋值,always@块下的信号 用reg型。这里的reg并不是真正的触发器,只有敏感列表 内的为上升沿或下降沿触发时才综合为触发器。 (2)另一个区别,举例: wire a; reg b; assign a = 1'b0; always@(*) b = 1'b0; 上面例子仿真时a将会是0,但是b的状态是不确 定的。因为Verilog规定,always@(*)中的*指的是该
always块内的所有输入信号的变化为敏感列表,就是说只 有当always@(*)块内输入信号发生变化,该块内描述的 信号才会发生变化。 像always@(*) b= 1'b0; 中由于1‘b0是个常 数,一直没有变化,由于b的足组合逻辑输出,所有复位 时没有明确的值--即不确定状态,又因为always@(*)块 内没有敏感信号变化,此时b信号一直保持不变,即不确 定是啥,取决于b的初始状态。
分享到:
收藏