逻辑设计心得

上传人:j****9 文档编号:46286488 上传时间:2018-06-24 格式:DOC 页数:8 大小:48KB
返回 下载 相关 举报
逻辑设计心得_第1页
第1页 / 共8页
逻辑设计心得_第2页
第2页 / 共8页
逻辑设计心得_第3页
第3页 / 共8页
逻辑设计心得_第4页
第4页 / 共8页
逻辑设计心得_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《逻辑设计心得》由会员分享,可在线阅读,更多相关《逻辑设计心得(8页珍藏版)》请在金锄头文库上搜索。

1、 序 很早之前就想对这几个月工作经历写的东西,一是作为自己的总结,二是自己也很想将自己这段时间的一些经历和大家分享一下,希望对初学者而言能使得他们能少走一些弯路。只是公司里的事情很多,最近经常加班,所以一直拖到现在。 能来到这家公司应该是一种缘份-缘起 NIOS。当初三月份 altera 来我们学校建立 SOPC 实验室的时候自己还不知道 NIOS 是什么东西,只是想在 altera 的 FAE 讲完 NIOS 后多问他几个时序约束的问题,然后拷一份 PPT 回去。但是想不到因为那一份 NIOS 的培训资料,我认识了 edacn 上的 cawan,他给我讲了很多 NIOS 的东西,之后是丁哥在

2、 SOC 版帖了位 NIOS 大赛的通知,然后我和队友就去报了名,并去川大参加了 NIOS 的培训,认识了峻龙的 FAE-也是我现在的 boss。在这里要谢谢 cawan、丁哥、和我一起参加 NIOS 竞赛的队友刘科以及我的 BOSS,是他们让我有了这一段的经历。 在公司里的几个月,做的项目其实不多,但是收获还是有一些,我觉得收获最大的是设计理念的改变,这也是我这段时间最想总结的,我会在后面逐渐阐述。时序是设计出来的我的 boss 有在华为及峻龙工作的背景,自然就给我们讲了一些华为及 altera 做逻辑的一些东西,而我们的项目规范,也基本上是按华为的那一套去做。在工作这几个月中,给我感触最深

3、的是华为的那句话:时序是设计出来的,不是仿出来的,更不是湊出来的。 在我们公司,每一个项目都有很严格的评审,只有评审通过了,才能做下一步的工作。以做逻辑为例,并不是一上来就开始写代码,而是要先写总体设计方案和逻辑详细设计方案,要等这些方案评审通过,认为可行了,才能进行编码,一般来说这部分工作所占的时间要远大于编码的时间。 总体方案主要是涉及模块划分,一级模块和二级模块的接口信号和时序(我们要求把接口信号的时序波形描述出来)以及将来如何测试设计。在这一级方案中,要保证在今后的设计中时序要收敛到一级模块(最后是在二级模块中)。什么意思呢?我们在做详细设计的时候,对于一些信号的时序肯定会做一些调整的

4、,但是这种时序的调整最多只能波及到本一级模块,而不能影响到整个设计。记得以前在学校做设计的时候,由于不懂得设计时序,经常因为有一处信号的时序不满足,结果不得不将其它模块信号的时序也改一下,搞得人很郁闷。 在逻辑详细设计方案这一级的时候,我们已经将各级模块的接口时序都设计出来了,各级模块内部是怎么实现的也基本上确定下来了。 由于做到这一点,在编码的时候自然就很快了,最重要的是这样做后可以让设计会一直处于可控的状态,不会因为某一处的错误引起整个设计从头进行。做逻辑的难点在于系统结构设计和仿真验证刚去公司的时候 BOSS 就和我讲,做逻辑的难点不在于 RTL 级代码的设计,而在于系统结构设计和仿真验

5、证方面。目前国内对可综合的设计强调的比较多,而对系统结构设计和仿真验证方面似乎还没有什么资料,这或许也从一个侧面反映了国内目前的设计水平还比较低下吧。 以前在学校的时候,总是觉得将 RTL 级代码做好就行了,仿真验证只是形式而已,所以对 HDL 的行为描述方面的语法不屑一顾,对 testbench 也一直不愿意去学-因为觉得画波形图方便;对于系统结构设计更是一点都不懂了。 到了公司接触了些东西才发现完全不是这样。 其实在国外,花在仿真验证上的时间和人力大概是花在 RTL 级代码上的两倍,现在仿真验证才是百万门级芯片设计的关键路径。仿真验证的难点主要在于怎么建模才能完全和准确地去验证设计的正确性

6、(主要是提高代码覆盖),在这过程中,验证速度也是很重要的。 验证说白了也就是怎么产生足够覆盖率的激励源,然后怎么去检测错误。我个人认为,在仿真验证中,最基本就是要做到验证的自动化。这也是为什么我们要写 testbench 的原因。在我现在的一个设计中,每次跑仿真都要一个小时左右(这其实算小设计)。由于画波形图无法做到验证自动化,如果用通过画波形图来仿真的话,一是画波形会画死(特别是对于算法复杂的、输入呈统计分布的设计),二是看波形图要看死,三是检错率几乎为零。 那么怎么做到自动化呢?我个人的水平还很有限,只能简单地谈下 BFM(bus function model,总线功能模型)。 以做一个

7、MAC 的 core 为例(背板是 PCI 总线),那么我们需要一个 MAC_BFM 和 PCI_BFM及 PCI_BM(PCI behavior model)。MAC_BFM 的主要功能是产生以太网帧(激励源),随机的长度和帧头,内容也是随机的,在发送的同时也将其复制一份到 PCI_BM 中;PCI_BFM的功能则是仿 PCI 总线的行为,比如被测收到了一个正确帧后会向 PCI 总线发送一个请求,PCI_BFM 则会去响应它,并将数据收进来;PCI_BM 的主要功能是将 MAC_BFM 发送出来的东西与 PCI_BFM 接收到的东西做比较,由于它具有了 MAC_BFM 的发送信息和 PCI_

8、BFM 的接收信息,只要设计合理,它总是可以自动地、完全地去测试被测是否工作正常,从而实现自动检测。 华为在仿真验证方面估计在国内来说是做的比较好的,他们已建立起了比较好的验证平台,大部分与通信有关的 BFM 都做好了,听我朋友说,现在他们只需要将被测放在测试平台中,并配置好参数,就可以自动地检测被测功能的正确与否。 在功能仿真做完后,由于我们做在是 FPGA 的设计,在设计时已经基本保证 RTL 级代码在综合结果和功能仿真结果的一致性,只要综合布局布线后的静态时序报告没有违反时序约束的警告,就可以下到板子上去调试了。事实上,在华为中兴,他们做 FPGA 的设计时也是不做时序仿真的,因为做时序

9、仿真很花时间,且效果也不见得比看静态时序分析报告好。 当然了,如果是 ASIC 的设计话,它们的仿真验证的工作量要大一些,在涉及到多时钟域的设计时,一般还是做后仿的。不过在做后仿之前,也一般会先用形式验证工具和通过静态时序分序报告去查看有没有违反设计要求的地方,这样做了之后,后仿的工作量可以小很多。 在 HDL 语言方面,国内语言很多人都在争论 VHDL 和 verilog 哪个好,其实我个人认为这并没有多大的意义,外面的大公司基本上都是用 verilog 在做 RTL 级的代码,所以还是建议大家尽量学 verilog。在仿真方面,由于 VHDL 在行为级建模方面弱于 verilog,用 VH

10、DL 做仿真模型的很少,当然也不是说 verilog 就好,其实 verilog 在复杂的行为级建模方面的能力也是有限的,比如目前它还不支持数组。在一些复杂的算法设计中,需要高级语言做抽象才能描述出行为级模型。在国外,仿真建模很多都是用 System C 和 E 语言,用verilog 的都算是很落后的了,国内华为的验证平台好像是用 System C 写。 在系统结构设计方面,由于我做的设计还不够大,还谈不上什么经验,只是觉得必须要具备一些计算机系统结构的知识才行。划分的首要依据是功能,之后是选择合适的总线结构、存储结构和处理器架构,通过系统结构划分要使各部分功能模块清晰,易于实现。这一部分我

11、想过段时间有一点体会了再和大家分享,就先不误导大家了规范很重要 工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。 在逻辑方面,我觉得比较重要的规范有这些: 1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来

12、很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。 2.代码规范。a.设计要参数化。比如一开始的设计时钟周期是 30ns,复位周期是 5 个时钟周期,我们可以这么写:parameter CLK_PERIOD = 30;parameter RST_MUL_TIME = 5;parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;.rst_n = 1b0;# RST_TIME rst_n = 1b1;.# CLK_PERIOD/2 clk | | | /clk | - | -10)禁止用计数器分频后

13、的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。如 FPGA 的输入时钟是 25M 的,现在系统内部要通过 RS232 与 PC 通信,要以 rs232_1xclk 的速率发送数据。不要这样做:always (posedge rs232_1xclk or negedge rst_n)begin.end而要这样做:always (posedge clk_25m or negedge rst_n)begin.else if ( rs232_1xclk = 1b1 ).end11)状态机要写成 3 段式的(这是最标准

14、的写法),即.always (posedge clk or negedge rst_n).current_state = next_state;.always (current_state .).case(current_state).s1:if .next_state = s2;.always (posedge clk or negedge rst_n).elsea = 1b0;c = 1b0;c = 1b0; /赋默认值case(current_state)s1:a = 1b0; /由于上面赋了默认值,这里就不用再对 b、c 赋值了s2:b = 1b1;s3:c = 1b1;default

15、:. 3.ALTERA 参考设计准则1) Ensure Clock, Preset, and Clear configurations are free of glitches.2) Never use Clocks consisting of more than one level of combinatorial logic.3) Carefully calculate setup times and hold times for multi-Clock systems.4) Synchronize signals between flipflops in multi-Clock systems whenthe setup and hold time requirements cannot be met.5) Ensure that Preset and Clear signals do not contain race conditions.6) Ensure that no other internal race conditions exist.7) Register all glitch-sensitive outputs.Synchronize all asynchronous inputs.9) Never rely on delay chains f

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号