概述
0.介绍
对于一块芯片的设计,尤其是芯片CPU内核,为什么你写的代码,别人不敢用,功能正确,验证通过,综合,编译通过,为什么还是没有人会使用?答案很简单,一个主要原因是,你写出的code,性能不高,风险较高,不满足严谨的工业级的开发标准。
下面介绍一下,一个最基本的RTL编写原则——尽量使用阶梯式的assign语句来编写,代替if-else,case的编写。
虽然if-else,case有很多优势,如:
- 有优先级顺序;
- 件覆盖率容易debug,这点对于验证来说,能够更快的debug出条件的覆盖率等
1.if-else,case的潜在问题
那么if-else,case在实际的电路设计中:
- 很少利用其优先级的顺序,绝大多数是并行选择电路;
- if-else综合的电路并不利于后续时序和面积的优化,降低电路的性能
- 并且if-else不能够传播不定态X,这一点对于后续电路,验证中,导致不定态被掩盖,从而诱导出致命错误。
2. 详细介绍if-else问题,使用Assign解决
- Verilog的if-else不能传播不定态X
对于一下代码片段,如果a的值为不定态,Verilog语法会将其a的值与a==0等效,从而out会选择in2,最终并没有将不定态传播出去。
if(a)
out = in1;
else
out = in2;
这种情况,有的人会说,那岂不是更好么,电路要的就是没有不定态,这个能够将不定态处理了,岂不是更好?
这种思想显然是错误的,并不符合设计的规范,并且在电路的仿真阶段,掩盖了前级电路不定态传播的风险,导致,在仿真阶段没有debug出来,造成芯片的错误。
改进的方法,推荐使用assign语句,如下所示:
assign out = a ? in2: in1;
按照Verilog的语法,则此电路会将不定态传播出去,在仿真阶段就能够发现电路的错误。
虽然,随着EDA工具的发展,很多eda工具都能能够将不传播不定态的情形强行传播出来,例如Synopsys VCS提供xprop选项。但是一方面不是所有的EDA工具又可以支持。
- Verilog的case也不能传播不定态X,和上面的问题一样。
- Verilog的if-else语法会被综合成为优先级选择的电路,面积和时序得不到优化
if(sel1)
out = in1[3:0];
else if (sel2)
out = in2[3:0];
else if (sel3)
out = in3[3:0];
else
out = 4'b0;
3.1 对于确实有优先级的逻辑设计
则更加推荐使用如下的设计形式:assign可以将其等效:
assign out = sel1 ? in1[3:0] :
sel2 ? in2[3:0] :
sel3 ? in3[3:0] :
4'b0;
此种可以规避不定态传播的问题,同时可以生成优先级电路。
3.2对于不需要优先级的逻辑设计
也推荐使用如下的设计形式,将其等效:
assign out = ( 4{sel1}) & in1[3:0] ) |
( 4{sel2}) & in2[3:0] ) |
( 4{sel3}) & in3[3:0] ) |
使用assign语法编写 "与"和“或”逻辑一定能够保证综合生成并行选择电路
- Verilog的case优先级选额电路
Verolog的case语法也会被综合成优先级选择电路,面积和时序均得不到优化,
虽然有的EDA工具可以提供注释,例如Synopsys parallel case和 full case 来时综合工具能够综合出并行选择逻辑,但是这样可以会造成前仿和后仿结果不一致的严重问题,从而产生重大的BUG。电路的开发中,一般尽量少用这些指引注释,并推荐等效的assign语法编写电路
3. 其他的Colding Style
电路设计一般分为数据通路、控制模块。因此,在数据通路的设计中,可以避免使用带有reset的寄存器,这样的设计方法会减少面积,并且能够优化时序。
因此,在数据通路的设计上,可以使用不带reset的寄存器,而只在控制通路上使用带reset的寄存器
最后
以上就是机灵春天为你收集整理的SoC芯片设计——为什么使用assign语句,来避免使用if-else或者case来设计电路。的全部内容,希望文章能够帮你解决SoC芯片设计——为什么使用assign语句,来避免使用if-else或者case来设计电路。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复