【Aquameoba】近来的小总结

近来陆陆续续干了些杂事,近来的事是帮助跑3X01的后仿,前面其实前仿也有问题,待我慢慢叙来。

首先出现的问题是用modelsim在跑前仿的时候会出现x,感觉这是非常不合理的一种情况,因为是前仿,又不是timingchecks task导致的x,那么一定是input了x,导致这里出现了x,最后发现是mem的初始化的时候有一部分的值没有初始化,但是最后却又读到了这部分的东西,而且由于是netlist,它引入了一个带DFF的反馈的结构,就会导致这部分除了给reset外,其他情况都不会使得这个DFF脱离x状态,这样的话,当x引入的时候就会导致后面的仿真都会出现问题(真2b的testbench我只能说)

这个结果追根溯源其实是testbench引入的x,导致DFF无法脱离x状态,但是本身这块逻辑是mux的结构,但是由于是很大的一部分组合逻辑,于是综合工具将mux的结构通过自己的优化算法转化成了一大端分摊开的组合逻辑门。好像通过修改综合工具的选项可以把这部分的逻辑换成别的结构的话可以避免这种情况,但是我觉得这不是根本的解决办法,其实还是testbench的问题。哼~

 

除了这个问题,后面还出现了其他的问题,就是nc和modelsim的前仿的结果不同,最后的结果是这样的。

首先就是nc对于artisan生成的memory模型仿真的时候会出问题,这个具体原因不知道,只知道肯定是组合逻辑和门级的逻辑在同一个time slice里面进行了大量的操作,使得操作的顺序出现了问题,于是对memory仿真的结果造成了影响,很简单的解决方法就是将artisan给的仿真模型在前仿的时候替换成手写的那种模型就ok了。注:只有nc有这个问题,modelsim没有这个问题。具体应该是blocking assignment的算法不一样导致的。这个问题到后面再说。

因为一定要改变memory的仿真模型,所以前仿的时候都是以modelsim为准(又臭又慢的modelsim)。

使用07综合的时候,modelsim仿真的时候调用的smic18.v的仿真库,可以一次性跑过,但是到了12的时候调用smic18.v就会出现问题,但是此时如果把smic18.v换成smic18_neg.v就能跑过了,什么原因呢?不知道。这里我只说一下自己的一点见解。

smic18.v和smic18_neg.v的差别就在于,smic18_neg.v支持negtive timing checks,其实你看到的在前仿的时候没啥区别,只是他们在对于sequential logic module建模的时候加入的delta的东西。抛开别的东西只看smic18.v和smic18_neg.v之间diff的东西。小摘录一下

wire dD;
wire dCK;

$setuphold(posedge CK &&& (flag == 1), posedge D, tsetup$D$CK, thold$D$CK, NOTIFIER, , ,dCK,dD);
$setuphold(posedge CK &&& (flag == 1), negedge D, tsetup$D$CK, thold$D$CK, NOTIFIER, , ,dCK,dD);

这期间,dD与dCK都是和input的D与CK之间半毛钱关系都没有,但是确实是可以仿通的,我的猜测是在specify里面,如果在setuphold函数里面的对应变量位置声明了dCK就是CK的delta delay的话就可以让仿真器认出这一点,那么dD与dCK就可以成功的进入仿真器的time slice,从而在对D采样的时候就更迟一些,就能搞定了。只是猜测,而且只是前仿的问题,后仿就不会有这种问题的了。

 

接着也就没啥事了,还看了看dc的lab,真是不错的东西,lab配上lab guide,感觉dc入门就是so easy。还写了一个修改sdf文件的脚本,作用就在于可以通过一个violation_list将从simulator里面提取出来的不满足时序检查要求,同时没有必要检查的一些DFF直接注释掉其timing checks,但是由于问题是sdf文件通常极大,所以改起来的速度很慢,感觉使用性不强,还不如一次一次的找呢,而且文件太大了,好像还会出问题,虽然还没弄懂是哪里的问题,也许是cashe的东西不够了,或者是awk或者是sed的buffer没有那么大导致的,但是总之,不好用,等哥以后掌握了perl以后再弄个试试看吧。

posted @ 2012-11-19 15:20  poiu_elab  阅读(721)  评论(0编辑  收藏  举报