在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 101282|回复: 324

[原创] IC前端设计絮论

[复制链接]
发表于 2011-5-3 22:46:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
前端设计做了几年,写一些东西来纪念一下。        基于工程经验,和一些书籍,比较繁琐,欢迎讨论。  
IC前端设计絮论01.pdf (178.51 KB, 下载次数: 3038 )
        不想下载的可以直接看下面。
        请不要灌水,否则会砍。
----------------------------------------------------

1.1 描述组合电路
1.1.1 always(verilog-hdl)/process(VHDL)function

●组合电路的描述可以使用always(Verilog-HDL)/process(VHDL) function(Verilog-HDL/VHDL)或并行赋值语句的方式描述

●使用function时,function内部if/case的分支也应写全



eetop_cn_1.jpg


24译码器组合电路的function写法


eetop_cn_2.jpg

24译码器组合电路的always/process写法

组合电路的描述方式可以分为两类,一类是在always(Verilog-HDL)process(VHDL)块内部描述,另一种则是在always/process块外部,使用function(Verilog-HDL/VHDL)加并行赋值语句的方式描述。

在使用always/process块描述组合电路时,是在敏感变量表内定义的信号值变换的同时刻,对always/process块内部的顺序执行语句进行赋值判断。当判断到always/process块尾部时,返回到块开头,重复判断。

在使用function描述组合电路时,是定义一个函数,此函数有且只有一个返回值,在调用此函数时实现组合电路。

使用这两类描述方式的优缺点对比如下表:

  
  
   

always/process

  
   

function或并行赋值语句

  
   

优点

  
   

·大多数情况下仿真及综合速度更快

   

·代码量略少(在组合逻辑不复用的情况下)

   

·更符合阅读习惯,信号关系更直接

  
   

·不会生成锁存器(latch)

   

·代码内组合电路和时序电路的区别一目了然

  
   

缺点

  
   

·可能生成意外的锁存器(latch)

   

·敏感变量表描述不全,将导致仿真和综合结果不相同。

   

·在一个块内对多个信号赋值,容易增加不必要的电路规模。

  
   

·Verilog-HDL函数内外有相同信号名时,可能混淆出错

   

·Verilog-HDL可能出现参数或返回值的位宽与实际调用对象不等的错误

   

·返回值只能有一个(需要多个返回值时可以使用信号接续的方式,Verilog-HDL使用{A_O,B_O},VHDL使用A_O&B_O)

  

使用function加并行赋值语句描述时,不会生成时序电路,因此可以明确地区分出组合电路,而不会造成always/process块那样的意外锁存器。但是,调用function时需要设定参数和返回值,增加了代码的工作量。特别当Verilog-HDLfunction内的参数未声明且模块内部有相同名称的信号时,会直接调用模块内信号,这在语法上没有问题,但出现bug时则难以发现。此外,当Verilog-HDLfunction的参数或返回值与实际调用的信号间位宽不等时,也是符合语法的,但实际上极有可能是错误。

使用function时,function内部的if/case分支未写全时,也不会生成锁存器。但在仿真时的动作与锁存器相同;而在使用综合工具生成实际电路时,未写全的分支会被判断成don’t care,此时组合电路的输出值可能被综合成1也可能是0。这样在RTL仿真和门级网表仿真时的动作可能不同,从而造成极大的危险。因此,即使是function内部,也应将if/case的分支写全。


相对而言,使用always/process块描述组合电路,代码工作量更少且便于阅读,但由于锁存器和组合电路的描述方式很接近,因此容易生成意外的锁存器。此外,当always/process块的敏感变量表未写全时,RTL仿真和门级网表仿真的动作将不同,有错误的风险。


虽然,always/process的敏感变量表遗漏或function参数位宽不匹配等问题是很小的笔误,但却可能造成实际的电路错误,而且在RTL仿真阶段很难发现。现今的IC设计规模都很大,不可能将每一个测试用例都在门级网表仿真下测试,故必须保证RTL仿真和门级仿真的一致性。因此,遵守良好的代码风格,保证RTL代码没有问题,并使用代码静态分析工具(lint)对其做检查。

RTL与门级网表仿真结果不一致的问题,除本节外,还可以参考

【上电复位应使用异步复位】

【门控时钟的使用】

【always/process块的输入信号应全部在敏感变量表内定义】

【always/process块的初始值描述】

【FF的描述】

【RTL代码动作不应依赖于parallel_case等综合器命令】

【注意输入信号的时序】

【不同仿真器间存在动作差异】

等章节。

发表于 2011-5-3 23:41:50 | 显示全部楼层
显然支持原创了,顶一下
发表于 2011-5-4 08:58:48 | 显示全部楼层
非常感谢
发表于 2011-5-5 13:04:13 | 显示全部楼层
原创的啊,楼主牛人啊
发表于 2011-5-6 14:02:45 | 显示全部楼层
写得不错,习惯上还是不喜欢用function,用process的确容易出现遗漏敏感条件导致仿真出不来的情况。
发表于 2011-5-6 17:17:31 | 显示全部楼层
看看,lz不错
发表于 2011-5-7 09:55:59 | 显示全部楼层
请问楼主
“RTL与门级网表仿真结果不一致的问题,除本节外,还可以参考

■【上电复位应使用异步复位】


■【门控时钟的使用】


■【always/process块的输入信号应全部在敏感变量表内定义】


■【always/process块的初始值描述】


■【FF的描述】


■【RTL代码动作不应依赖于parallel_case等综合器命令】


■【注意输入信号的时序】


■【不同仿真器间存在动作差异】


等章节。


这些是你准备要出的吗?如果是,期待ing
发表于 2011-5-9 21:20:01 | 显示全部楼层
后面的没了吗?
发表于 2011-5-9 21:31:58 | 显示全部楼层
顶一下先
发表于 2011-5-9 22:15:28 | 显示全部楼层
kankan
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 05:23 , Processed in 0.028423 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表