我是靠谱客的博主 机灵春天,最近开发中收集的这篇文章主要介绍SoC芯片设计——为什么使用assign语句,来避免使用if-else或者case来设计电路。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

0.介绍

对于一块芯片的设计,尤其是芯片CPU内核,为什么你写的代码,别人不敢用,功能正确,验证通过,综合,编译通过,为什么还是没有人会使用?答案很简单,一个主要原因是,你写出的code,性能不高,风险较高,不满足严谨的工业级的开发标准。

下面介绍一下,一个最基本的RTL编写原则——尽量使用阶梯式的assign语句来编写,代替if-else,case的编写。
虽然if-else,case有很多优势,如:

  1. 有优先级顺序;
  2. 件覆盖率容易debug,这点对于验证来说,能够更快的debug出条件的覆盖率等

1.if-else,case的潜在问题

那么if-else,case在实际的电路设计中:

  1. 很少利用其优先级的顺序,绝大多数是并行选择电路;
  2. if-else综合的电路并不利于后续时序和面积的优化,降低电路的性能
  3. 并且if-else不能够传播不定态X,这一点对于后续电路,验证中,导致不定态被掩盖,从而诱导出致命错误。

2. 详细介绍if-else问题,使用Assign解决

  1. 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工具又可以支持。

  1. Verilog的case也不能传播不定态X,和上面的问题一样
  2. 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语法编写 "与"和“或”逻辑一定能够保证综合生成并行选择电路

  1. 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来设计电路。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部