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

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

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 begin
    cnt = 3'd0;
end

always @(posedge clki)
begin
    cnt <= cnt + 1'b1;
end

endmodule

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 0

run

在运行仿真时,将上述脚本加入到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
          -drive
              attach 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 纳秒时释放对信号的强制赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值