verilog reg变量问题
看到那并行数据流转换为串行数据流的设计
里面程序
他在初始化定义变量时候
为何出现了
reg scl,link_sda,sdabuf;
reg [3:0] databuf;
reg [7:0] state;
assign sda=link_sda?sdabuf:1'bz;//link_sda控制sdabuf输出到串行总线上
为何要定义link_sda,sdabuf和databuf,这些变量在系统图都看不到啊
还有在verilog中什么时候要定义reg变量呢
初学者还弄不清这个问题
有人知道吗,谢谢
个人观点
个人观点,达人指正!
按小弟自己的理解,如果按仿真语义理解:被定义为reg的量被赋值时都有敏感事件表,当定义为reg的量被右侧表达式赋值时,如果右侧表达式中的变量
都包含在敏感事件列表里,则是组合逻辑;右边的表达式中的变量不在或不全,则可能为锁存器或寄存器。
您问的问题本人觉得是verilog中最有深度的问题,我上面的理解也不知对不对,希望有小编,巨牛级别的人物来指正或讨论!
顺便说下,verilog是中用在计算机中跑的语言,却又是专门描述物理硬件行为的语言,所以有软件语言的特点(什么左值,右值,表达式。)
但又有硬件电路的特点,确实很让人混淆!
还是不太明白
这问题确实有点恼火
can you show us the whole design?
简单说吧,用always去赋值的都要定义成reg,用assign去赋值的都要定义成wire,可综合的代码基本就用两个。
至于testbench中的initial中的信号要定义成reg。task中的好象也要定义成reg。反正写好code后拿语法检查工具一看就知道了。呵呵
没弄明白
reg是寄存器,组合逻辑中是不用的
学习中
我来谈谈我对于这个问题的理解:
1:首先针对可综合的verilog或者VHDL语言(有些verilog或者VHDL语言的语法不具有可综合的代码风格,比如“%”,但是他们用来作function 的simulation或者是做testbench时却是非常方便的),我们在coding的时候,要做到心中有circuit。是先在大脑中设计好电路然后再用代码来实现电路,那么此时我们应该对设计中那些变量应该作为wire,那些变量作为reg就有了一个初步和比较清晰的概念,这个是定义reg变量最核心的一条,需要很多的设计经验或者参考好的设计范例,包括对整个ic design flow的了解。
关于第一点,我体会最深的就是我们的算法设计人员设计出来的电路往往是行不通的。
2:针对于同步设计中,我们对于数据流和控制流的同步问题,是通过添加reg来控制的。
3:对于之后的complie时,便于我们做更好的constrain,需要对设计的partation做考虑,这时候我们一般考虑reg in \reg out的port定义。也就是我们看到一些参考范例输入输出做 reg变量的原因。
4:就是我们考虑area和speed 的blance问题,一句话就是“big area high speed”,对于复杂的运算,我们可能会将一级运算打断变成两级(原来1个clock的工作变成2个clock完成),来优化我们的面积。此时也是用reg记录中间变量来作的。
以上就是我暂时能够想到的对于 reg变量的理解,总之一句话:做ICdesign 心中要无时无刻 装着电路!
还不是很懂 已开始学感觉似懂非懂
Actually you can use reg variable in a combination logic. here is an example.
input din;
reg abc;
always@(din)
abc = din;
In here, it is equivilent to
wire abc;
assign abc = din;
Yes,I agree with up.
But who can tell the effects when a wire/reg variable is synthesized?
Maybe just like its name,a wire is a wire and a reg is a implement that can retain the value?
描述很清晰,但是第四点里面貌似有点小错误,用寄存器将关键路径一分为二可以提高该模块时钟频率,但是会增加面积(high speed,big area)
reg 不一定是寄存器的,这个reg只是可能会成为寄存器。
6楼说的很清晰,这也是我的理解
这个reg在这里用 会直接被编译器理解为wire类型,得到一个组合电路
reg用在always里 且有时钟才会理解为寄存器
