always实现组合逻辑.常用吗?
- reg a;
- always(*)
- begin
- a = b&c;
- end
上面是简单例子,老板说业界推荐使用always来实现组合逻辑。
我下来怎么也想不出原因... 为什么要推荐使用always?
是因为很多时候不小心把wire型变量和reg型弄混了吗? 所以干脆就全部reg,在always里实现组合功能了?
1. 可以寫得抽象, 不用去用人腦做邏輯化減.
2. 使用always@(*) 可以避免 sensitive list不齊全導致的Latch問題.
3. reg不是實體DFF/Register.
要么assign 要么always,也没有其他结构了
assign和always各有所长,没有哪个更主流。
某些情况下always写的组合逻辑可读性更强吧,而assign更加简洁,但某些情况下可读性差。
分情况,也看个人写code 风格。
关键看用于什么,比如用于传输延迟建模 可能表述为 always *, a<=#5 b&c, 而连续性赋值的内部延迟可以抑制毛刺。 assign #5 a=b&c; always用于组合逻辑要考虑仿真的时序延迟。
使用always多了,自己会把该组合逻辑的实现方式想的比较明白,但是assign这种方式有点简单,容易犯错。纯粹个人经验!
always 写起来更加像是软件的代码,如果有软件的背景,写起来会比较像
在你这个例子中,always和assign没有任何区别。在一般的例子中,always常用if-else和case,而assign中只能用“? :”,这会导致不定态相关的一些差别。
比如,always@(*) if(A) B=1; else B=0; 这条语句中,如A为不定态,B的结果为0,即导致不定态终止。
而assign B=A?1:0; 这条语句中,如A为不定态,B的结果也为不定态,即使不定态传播。
相关事项非常复杂,但结论是只用“? :”的结果是相当完美的。
常用呀, 首先你要搞清楚组合逻辑和时序逻辑的实质, 建议小编继续在硬件描述语言上下功夫,你还没搞清楚基本东西。
非常感谢各位的意见~
复杂的可以用 always, 简单的就用 assign 好了
学习了
学习了
是常用的!
个人觉得assign语句用于比较简单的逻辑,一条语句到头;而always可以把N个语句括到一起,形成逻辑块,可读性和结构化更强。
看使用情况吧~
对于复杂的组合逻辑,使用always实现组合逻辑的话,会比assign进行EDA仿真快很多
always模块的使用可以使得程序的可读性大大提升!
都可以,这些都是小问题
这个要看 公司或者个人的 code stytle , 我个人推荐 不要用 always 实现组合逻辑, assign 可以实现 任何组合逻辑,always 用来实现 时序逻辑很好。
这两种语句的实际组合电路模型不一样吗?还是说仿真结果不一样?
其实真的无所谓的
仿真结果(验证结果)不一样。可能导致RTL仿真通过,而实际电路/后仿结果不通过。换句话说,带不定态插入/不定态终止的RTL代码不利于验证。
不定态终止范例:
- always@(*)
- if(A)
- Y = B;
- else
- Y = C;
不定态插入范例:
- always@(*)
- case(A[1:0])
- 2'b00 : Y = B;
- 2'b01 : Y = C;
- 2'b10 : Y = D;
- default : Y = 'bx;
- endcase
以上两种都不利于RTL验证。
解释的很好!
但是个人觉得一般还是会采用第一种写法。
同感
Timme 逻辑开发工具和过程的理解很深刻。佩服,以后还请多多指点。你这个说明可能回答了我在工作中遇到的那个问题,功能仿真没问题,下载后基本上完全是乱的,我上周一直在找原因,现在回想起来,应该跟这个有关系了。因为整个功能用了4个状态机,都是3段式,第二段都是always(*)的组合逻辑。
你描述的这个情况,时序约束出问题的概率更大些。
回复 10# Timme
有道理
学习了
