微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > RTL上板验证部分不通过

RTL上板验证部分不通过

时间:10-02 整理:3721RD 点击:
最近有一个小项目,前端RTL代码已经编写完成,前仿真也全部顺利通过,在进行综合之前把code拿到FPGA开发板上进行上板验证,开始给了几组输入激励信号,发现没有什么问题,板上输出的信号功能,时序都和前仿真一致,但是后面再输入了几组其他的激励信号后,发现有部分输出与前仿真结果不一致,而其他信号输出却没有什么问题,感觉很奇怪,以前没有遇到过这种问题!
   我试着用signal tap 观测了一下内部信号,发现很奇怪,所以发上来让大家帮我看看是什么原因:
         本来逻辑是 a = b && c ; 当a为高电平的时候, 状态机从 state_A 跳变到state_B, 根据逻辑a信号只有一个clk的高电平,但是用signal tap 检测到的却是 a ,b,c一直都为0,可奇怪的是状态机却跳变了,也即从state_A 跳变到state_B,不知道是不是由于毛刺信号或者时序紊乱造成的,后来将采样频率提高到clk频率的10倍,也没有发现a,b,c三个信号有高电平出现,但是状态机确实就跳了,不知道问题出在哪里,求讨论!

我之前也出现过类似的问题,状态机无缘无故跳到另外一个状态,后来改了状态机编码方式,就没出现了。一直没想明白什么原因。

1.确定前仿激励没有给不定态,而且RTL中没有不定态插入。所谓不定态插入就是类似:

  1. always@(*)
  2.   case(A)
  3.     1'b1 : Y = 0;
  4.     default : Y = 1'bx;  //X-Insertion When A==1'b0
  5.   endcase

复制代码



2.确定时序约束是完整的;

3.确定SignalTap添加节点的类型是Pre-Synthesis



    状态机采用的独热编码,应该是最保险的吧



    谢谢你的回复,激励信号没有给不定态,而且设计中也全是full-case的;
至于时序约束,上板验证我没有给特定的约束,以前也是这么做的,让fpga自动给我最优时序,这样会导致问题出现么?
signalTap我pre_synthesis和post-synthesis都试过了,结果是一样的,而且每次测试都是同一个地方出问题,其他逻辑暂时都还正常!

用出问题的那几组激励信号重新做下前仿真看看。
可能状态机写得有问题。

Quartus基本没有自动加时序约束的能力,不写时序约束要功能正确只能拼RP。

我当时用的就是独热码出的问题,后来改成2进制编码就没问题了,时序当然是满足的。

1.时序是否满足?
2.做过后仿真没?

想请教一下RTL中插入连不定态会怎么样?
以前公司的教育是:default里尽量放不定态,有利于减小综合面积,有利于前后仿一致,有利于……
当然这个default正常情况是不会到达的。

和代码风格有关。



    这就怪了,没有理论依据啊!

    是这样的,插入不定太的话,就不会综合成相应的电路,因此占用的面积就自然小了,但是会有警告!如果default项里放的不是不定太的话,会综合成相应的电路,而不是被忽略掉!
其实可以不写default项,然后综合的时候添加"//synthesis full case"

对假如去除default就变成非full case的case语句,default赋不定态有两种情况:
1. default会被击中。则后续如遇到不定态终止(如if-else),则可能造成前后仿不一致。
2. default不会被击中。此时
(2.1)首先你得花大量精力去保证,该default确实不会被击中。
(2.2)该段逻辑在每次综合时的功能可能不一样,降低了Silicon Proven的价值。比如,你的前仿环境遗漏了击中Default的情况(有Bug未被发现),流片版本1中恰好被综合成没有Bug的逻辑(Bug被彻底掩盖),流片完反复测试后你认为该代码是Golden的。好了现在流片版本2,该段代码被综合成Bug会被击中的逻辑。

对假如去除default就是full case的语句,default赋不定态是标准的做法。这样不会造成不定态插入,只是不定态传播。
如果full case不写default,则会造成不定态终止。

对于你说的2.1,我觉得既然设计成default不会被击中,那前仿验证者有义务花
大量精力去验证,该default确实不会被击中。
对于2.2,我感觉你的意思就是,default放固定值,万一前仿有遗漏、芯片仍然存在bug时,
能有更高概率能避免bug的触发。
但事实上,default放固定值,前仿时肯定是不利于X的传播,不利于bug的暴露的。
对于default该放什么,公司的教育是尽量要放X,但我看很多IP,无论大公司
还是小公司的,似乎更多是放固定值的,以至于我很困惑到底怎样比较好。

default放固定值是不能考虑的,因为会不定态终止。
我的建议是把case补全为full,再加default赋不定态;如果case直接补全为full不现实,则用一些变通的手段达到相同的效果。
这样也有个麻烦就是会带来击不中的语句,需要加SVA确保这些语句确实未被击中,不过不是什么大问题。要彻底解决只能不用case。
2.2的意思是保证silicon proven是有效的,假如任意一次流片回来测不到bug,就可以断定代码在未来的综合中也没有bug。(这个对IP来说尤为重要)
ARM 10年前的paper没有对情况2提出太多的异议,也没有提到2.2,但实际上近年Cortex代码里已经基本不用case语句了(基本上就保留jtag状态机在用,full case + default x)。
ARM以外的软IP很多代码风格都乱七八糟,不建议效仿。

那问个具体的吧,比如说状态机,很难全case吧,特别是one hot编码的状态机,default里放什么好?
> 近年Cortex代码里已经基本不用case语句了(基本上就保留jtag状态机在用,full case + default x)
你的意思是jtag以外的状态机都不用case写了?还是连状态机都不用了?

一是你可以写成Binary编码,然后在综合工具里设置fsm encoding style。

二是直接把Onehot写成sum-of-product形式,这是ARM 10年前的paper里推荐的。(所谓sum-of-product就是先“与”再“或”)

  1. Recommendation 8: For one-hot logic on a critical path, write the RTL directly in a sum-of-products form (rather than case) and add a one-hot assertion checker.

复制代码


http://www.arm.com/files/pdf/Verilog_X_Bugs.pdf



谢谢。我好好研究一下。

看下代码,状态有没有带复位,一定要带,
one hot应该是没有问题的,
fpga综合的时候,状态机会被综合成one hot 个人认为是one hot的频率跑的能搞比较高,不过这个时候是没有default了。

把你STATE跳转部分的RTL放上来看看....应该是你状态跳转的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top