systemverilog中for循环一个多bits variable的严格正确写法与综合比较

1.首先看某大厂给出的一小段代码:



这段code什么意思呢?

起初:

1)我认为是wvalid = 0;

2)下面循环的任何一次为1,就把wvalid赋值成1;

3)结果就是一旦wvalid为1,那么就永远为1,不管循环了多少次。

4)但是仔细想想,怎么会有这么vagary的逻辑呢?一定不是这样的,百思不得骑姐啊!!!

5)只好综合一下了,看下图:



原来是把各个对应位作AND,然后在把所有AND结果做OR(或者说和上一次循环的结果做OR),这样就舒服多了。有点像C 语言的a +=1 这种感觉。


2.那如果去掉每次 “或wvalid”  ,改成下面这样会怎么样呢?



可以预想一下,3bits 的结果怎么可能赋值给1 bit 的wvalid?直观上就是有问题的,但还是看看结果吧。



果不其然,这是个啥???至少我不确定,感觉很不稳妥。


3.那在上面的基础上继续修改,既然上面不行,那就在前面加上一个  “ | ”,好多代码都是这么写的,感觉这样应该可以,嗯,只是感觉。



毕竟我是把 3bits variable 取或,自信满满哒,看下结果吧。



炸裂!!!居然和想象的不一样(综合的时候要有output,否则会优化掉,什么也看不到,居然会犯这种错误)。


不要问我为什么,我也不知道!

1)也许这就是客观世界存在,不需要原因。

2)也许这是vendor的问题,版本不一样。或者别人家的tools会不一样

3)也许是综合的时候加上某个command 会 enable 某个feather吧,但是我不知道哦。


总之呢,就严格按照第1种方法写就好了,其他的就不用考虑了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值