如何遍历force多位宽信号的每一比特?

大家在构建测试激励时,经常会遇到需要使某个信号强制变成某个值,此时我们经常会用到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的那一位或者那一个片段的索引值在仿真运行开始时是常值。


智慧楼宇照明控制系统解决方案
闪迪推出全新Z400s SSD固态硬盘,旨在替代传统硬盘(HDD)
C语言的发展历程是怎么样的
STM32烧录出现The core is locked up的解决办法
简述人机界面和数据可视化UI的设计
如何遍历force多位宽信号的每一比特?
中兴通讯发布业界首个基于5G手机的边缘云远程渲染解决方案
摩托罗拉Capri系列现身WiFi认证网!不支持5G网络
物联网发展不平衡 对比eMTC国内更侧重NB-IoT
示波器最重要的三个参数
LPC下的应用三相输配电功率因对数测控系统的设计
lm706应用电路图
米家iHealth体温计评测 真正的为发烧而生
三星稳占全球最大手机制造商第一位置长达8年 它到底凭什么长年屹立不倒
咕咚智能心率手环怎么样 199元的价位上可以说非常的出众了
在三极管中,如何判断发射极正偏,集电结反偏?
测量材料表面,就可以提升光学设计精确度?
智能镜面显示屏将会是一款让你上瘾的智能设备
利用MOD—BUS通信协议构建集散控制系统实现触摸屏与单片机的通信
领跑智能家居新赛道,Aqara全屋智能撬动万亿蓝海市场