当前位置: 首页 > news >正文

【验证问题记录-001】后仿中无复位寄存器的初始化问题

【验证问题记录-001】后仿中无复位寄存器的初始化问题

文章目录

  • 【验证问题记录-001】后仿中无复位寄存器的初始化问题
    • 1. 问题背景
    • 2. 问题描述
    • 3. 原因分析
    • 4. 解决方案
    • 5.相关拓展
      • 5.1 用法说明
      • 5.2 示例用法

1. 问题背景

在数字设计中,为了追求极致的性能、面积与功耗,经常会使用无复位的寄存器,相对于有复位的寄存器,无复位寄存器具有以下优点:

**面积小:**无复位寄存器通常比带有复位功能的寄存器占用更少的硬件资源。在芯片设计中,面积是一个重要的考虑因素,因为较小的面积可以降低芯片成本、提高集成度。

**功耗低:**由于无复位寄存器的结构相对简单,其功耗通常比带有复位功能的寄存器低。这对于低功耗设计非常重要,特别是在移动设备和嵌入式系统中。

**性能高:**在某些情况下,无复位寄存器可以提供更高的性能。例如,在高速数据传输和处理中,无复位寄存器可以减少复位操作带来的延迟,提高系统的响应速度。

但是使用无复位寄存器最大的问题是初始状态不确定,无复位寄存器在上电或系统启动时,其初始状态是不确定的。这可能会导致系统在启动时出现不可预测的行为,需要额外的逻辑来处理初始状态的不确定性。在数字设计中使用无复位寄存器需要权衡其优缺点,并谨慎处理。

根据复位值是否使用,可以划分为两种情况,第一种情况为复位结束后不使用复位值。例如在数据传输时,除了数据信号外,还有指示数据是否有效的指示信号,这种情况下,数据信号的复位值是无意义的。第二种情况为复位结束后使用复位值,但对于值是多少并不敏感。例如时钟分频电路。

在数字后仿中,针对第一种情况,无需处理,而针对第二种情况,就需要使用仿真工具提供的一些方法,给予相应寄存器一个初值。

2. 问题描述

以下代码是一个时钟8分频电路模块,因为有initial语句的初始化,所有在RTL级功能仿真时不会有问题,但是该RTL在综合为网表后,initial语句将会被忽略,在后仿中cnt的值会一直保持为不定态x,给仿真带来功能性问题。

module clk_div(input       clki,input       clko
);reg  [2:0]  cnt;assign clko = cnt[2];initial begincnt = 3'd0;
endalways @(posedge clki)
begincnt <= cnt + 1'b1;
endendmodule

3. 原因分析

综合工具在将RTL在综合为网表的过程中,initial语句会被忽略,上述代码中的cnt寄存器会保持不定态x,导致仿真功能出现问题。

4. 解决方案

VCS(Verilog Compiled Simulator)的 UCLI(Unified Command Line Interface)模式是一种交互模式,它提供了一个命令行界面,用于在仿真过程中进行交互操作和调试。在仿真的0时刻,可通过如下命令初始化上述的cnt为0。

force -deposit test_top.dut.clk_div_cnt_reg_0_.Q 0
force -deposit test_top.dut.clk_div_cnt_reg_1_.Q 0
force -deposit test_top.dut.clk_div_cnt_reg_2_.Q 0run

在运行仿真时,将上述脚本加入到simv的参数中

./simv -ucli -i init.ucli

5.相关拓展

force是 VCS在UCLI模式下的一个命令,用于在仿真过程中强制将一个特定的值赋给一个信号或变量。下面是它的使用说明。

force                        Force or deposit a value on a signal/variable
Usage:force <nid> <value>[<time> {, <value> <time>}* [-repeat <time>]][-cancel <time>] [-freeze|-deposit] [-drive]force <nid> -cancel <time>where 'nid' is a nested identifier (hierarchical path name)'value' is the new value to be applied'time' is a [@]<number>[.<number>][<unit>]'@' identifies an absolute time'unit' is one of [ s | ms | us | ns | ps | fs ]-repeat <interval>repeat the waveform every relative time interval-cancel <time>release the forced value after the specified time-freeze|-deposit-freeze: default. Freeze the value to the forced value-deposit: value can be overwritten by a subsequent driver transaction-driveattach a new driver to the signal (VHDL only)
release                      Release a variable from the value assigned using 'force'
Usage:release <nid>where 'nid' is a nested identifier (hierarchical path name)

5.1 用法说明

  1. 基本语法

    • force <nid> <value>:其中 “nid” 是嵌套标识符,即信号或变量的层次化路径名称;“value” 是要强制赋予的新值。

    • 可以在后面添加时间信息和其他选项,例如

      <time> {, <value> <time>}* [-repeat <time>]] [-cancel <time>] [-freeze|-deposit] [-drive]

  2. 时间参数

    • “time” 表示时间值,可以是绝对时间(以 “@” 开头)或相对时间,后面可以跟时间单位,如 “s(秒)”“ms(毫秒)”“us(微秒)”“ns(纳秒)”“ps(皮秒)”“fs(飞秒)”。
  3. 选项说明

    • -repeat <interval>:以相对时间间隔重复指定的波形。
    • -cancel <time>:在指定时间后释放强制赋值。
    • -freeze(默认):将值冻结为强制值,即后续的正常驱动不能改变该值。
    • -deposit:值可以被后续的驱动事务覆盖。
    • -drive(仅适用于 VHDL):为信号附加一个新的驱动器。

5.2 示例用法

  1. 简单强制赋值
    • force top_module.sub_module.signal_name 1'b1:将名为 “signal_name” 的信号强制赋值为逻辑 1。
  2. 带时间参数的强制赋值
    • force top_module.sub_module.signal_name 1'b1 @10ns:在绝对时间 10 纳秒时将信号强制赋值为逻辑 1。
    • force top_module.sub_module.signal_name 1'b1 5ns, 1'b0 10ns:在相对时间 5 纳秒时将信号赋值为逻辑 1,在相对时间 10 纳秒时将信号赋值为逻辑 0。
  3. 生成重复波形
    • force top_module.sub_module.signal_name 1'b1 5ns -repeat 10ns:从相对时间 5 纳秒开始,每 10 纳秒重复将信号赋值为逻辑 1。
  4. 释放强制赋值
    • force top_module.sub_module.signal_name 1'b1 -cancel 20ns:在相对时间 20 纳秒时释放对信号的强制赋值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TypeScript接口
  • C#环境搭建和入门教程--vs2022之下
  • shell脚本之双重循环(详解)
  • 批量插入insert到SQLServer数据库,BigDecimal精度丢失解决办法,不动代码,从驱动层面解决
  • 《机器学习》—— PCA降维
  • ios xib 子控件约束置灰不能添加约束
  • 我发的共同一作,到底有没有用?
  • vue3 自定义指令 directive
  • 项目管理:如何确保目标的实现?
  • 基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统
  • 二层交换机和三层交换机的优缺点
  • 【LoRA】浅谈大模型微调之LoRA技术
  • 快速了解高并发解决方案
  • 如何在Oracle中实现数据的加密
  • 基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码
  • [Vue CLI 3] 配置解析之 css.extract
  • [译]如何构建服务器端web组件,为何要构建?
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Cookie 在前端中的实践
  • Java超时控制的实现
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis中的lru算法实现
  • Sass Day-01
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vagrant 添加本地 box 安装 laravel homestead
  • Web标准制定过程
  • 后端_MYSQL
  • 扑朔迷离的属性和特性【彻底弄清】
  • 区块链技术特点之去中心化特性
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • HanLP分词命名实体提取详解
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #HarmonyOS:基础语法
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十三)MipMap
  • (四)Linux Shell编程——输入输出重定向
  • (小白学Java)Java简介和基本配置
  • .CSS-hover 的解释
  • .gitignore文件—git忽略文件
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 解决重复提交问题
  • .net 验证控件和javaScript的冲突问题
  • .sys文件乱码_python vscode输出乱码
  • ?php echo ?,?php echo Hello world!;?
  • @EnableWebSecurity 注解的用途及适用场景
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [C++][数据结构][算法]单链式结构的深拷贝