大家在构建测试激励时,经常会遇到需要使某个信号强制变成某个值,此时我们经常会用到Verilog和SystemVerilog中的force实现这样的功能。但是有时候在对多位宽的信号进行force时有时会出现编译错误,这是为什么呢?本文将对此类情况进行示例说明。
【示例】
【仿真结果】
示例中,通过三种方式对sig中的部分位选进行了force。通过force将sig中的第0位force为了1,从显示信息可以看到sig[0]已经被修改;通过force将sig中的第0位和第1位force为了00,从显示信息可以看到sig[1:0]已经被修改;通过force将sig整体force为了0111,从显示信息可以看到sig[1:0]已经被修改;
可以看到,我们可以通过force对于变量、变量中的某一位或者某一个片段进行改变,那么可能有些人觉得这么一位一位的进行force太麻烦了,是否可以使用for循环对sig中所有位遍历进行force呢?请看下例。
【示例】
【仿真结果】
编译错误!这是为什么呢?对比该示例和上一示例,可以发现当信号的索引为常值时,可以进行force,但是当索引为变量时,此时编译不通过。
也就是说在对信号进行force的时候,如果要对其中的某一位或者一个片段进行force时,其中的索引只能是常数不能是变量,否则将会导致便以失败。
那么如果想实现通过变量实现对于多位宽信号中每一位进行force还有什么办法吗?下面我们通过示例介绍几种。
【示例】使用generate结构
【仿真结果】
示例中,使用generate结构实现了对于sig中每一位的遍历。这其实借助了generate是在仿真前的析构(elaboration)阶段完成的特性,即在仿真开始之前,相当于已经将sig被force的每一位的initial结构都已经生成好了,这样在仿真开始执行时(生成好的initial块开始被执行时),其中“force sig[i]”中的i都已经是确定的值了,因此就可以避免force信号中某一位时,索引为变量的情况。
除了这种在析构(elaboration)阶段就生成好语句结构的方式外,还可以想如下方式操作。
【示例】
【仿真结果】
示例中,实际上是将要force的信号每一位都单独写了出来,即保证了被force信号的索引都是常量,缺点是,如果这个信号比较宽,那么写起来比较枯燥,没有上一种使用generate结构方便。但是实际上两者之所有都没有问题,其实都是保证了被force信号的索引是个常值。
所以,如果在实际使用时,需要对多位宽信号的每一位或者某一个片段进行force,那么需要保证被force的那一位或者那一个片段的索引值在仿真运行开始时是常值。
审核编辑:刘清
-
仿真器
+关注
关注
14文章
1011浏览量
83582 -
Verilog语言
+关注
关注
0文章
113浏览量
8204
原文标题:如何遍历force多位宽信号的每一比特
文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论