请教阻塞和非阻塞幅值的问题
always @(a or b or c)
begin
if (a)
out <= b + c;
else
out <= b - c;
end
把非阻塞幅值变为阻塞结果一样吗?
另外,可以否把赋值语句写成out = #1 b + c?
谢谢
但是用非阻塞的话DC综合工具会报warning,这是有什么考虑吗?
一般的编码规范都禁止在组合电路里用非阻塞赋值
加延时不是只是仿真的时候用的吗?综合的时候延时会被忽略的。
不少台湾公司的coding style会在<=后面加个小延时
为了对波形不会看花
我常想这是为了模拟hold time吗
一般做过几个月的时候碰到这种时序电路都不会看花吧
只要弄懂
a = b;
b = c;
和
a <= b;
b <= c;
之间的差别,阻塞和非阻塞就没有什么问题了。很简单的概念。
同意前一句,后一句不对,delta time的处理是仿真的基本,不可能有问题的
啥叫有关?仿真能和仿真工具无关吗?
如果你指的是同样的verilog文件不同仿真器可能会有不同的行为,那是对的。但是这个和加不加delay没有关系。
我说的很清楚了,这个不是你显式加入delay就能解决的。如果把这两个连起来说,只能说明你的老师概念不清或者你转述有误。
其实是会有问题的,这种case我遇到过,加delay确实是为了保证仿真没有问题
以前项目中遇到的,时钟分频引起的,具体case比较复杂
我知道你什么问题了,就是下面的问题
always@(posedge clk) beign
clk_div <= ~clk_div;
reg_xxx <= ~ reg_xxx;
end
然后你使用clk_div去sample reg_xxx,这样就依赖于仿真器的调度了。
这种问题实际上综合也有多种理解的,这种是要特殊注意的。
简单来说是这种case,但是对于一般的case来说VCS是没有问题的,所以加delay是为了避免这种问题影响debug进度
sram会对输入信号有时序要求,要是输入变化和时钟边沿重合的话,vcs会报hold或者setup时间错误
假如出现:
a <=b;
if(condition)
a <= c;
这样<=和=会不一样吧。
呵呵,你怎么保证综合的结果和你加delay的结果是一致的?
的确如此至今尚未见过混合写法还没被老大们喝止的rtl
好吧,我曾经工作过的一家北欧公司在代码风格中有些情况下要求使用一段式状态机描述(就我所见,独此一家),而当输入条件较多时,建议在同一时序always块中定义和使用临时变量来简化描述——这样做IEEE标准支持,综合和仿真工具也支持,并无任何不妥
所以说,你没见过,不代表它不存在,当然这也并不说明什么问题。在你所引用的那篇文章中,作者仅仅表达了他的个人见解和建议,也没有一味否定其它代码风格,态度比较客观
还是那句话,谁官大听谁的。你我不是一家公司,所以争这么没意思。
嗯,都是为了实现更好的综合效果
而且更好的都是用专门的模块或者宏来实现always(posedge clk)
分别产生触发器的D端、Q端、E端来调用模块或者宏
这样在整个RTL里面甚至都看不到一个always了
同意。对于没有明显对错的问题,领导说了算
其实,林子大了,什么鸟都有——我现在所工作的美国公司,代码风格中要求:
- 只能Verilog-95以下
- 组合逻辑的条件判断只能使用“?:”
- 时序逻辑不许用always描述,只能显式调用时序逻辑单元
......
我们公司卖IP,所以要考虑所有客户的EDA工具版本情况......
想啥呢,没有综合、P&R、功耗等等参考信息哪个客户会买你的IP
客户怎么会关心DC的版本,netlist deliver过去就行了
“所以要考虑所有客户的EDA工具版本情况”——是我们要关心客户的情况,我们公司的IP提供源代码支持
夏虫不可语冰,这种风格代码大公司多了去了。我以前工作的一家北美公司里面对于复杂调度算法经常使用临时变量,人家的ASIC用在核心网络里的多了,也没见有啥问题。。。
本来这就是一个风格的问题,怎么做都没问题。真是看不惯有些人倚老卖老,觉得别人都是弱智。