欢迎大家通过博客浏览我的历史文章,博客园包含了目前为止所有的文章,浏览效果更佳,并且有评论留言功能,有任何问题都可以给我留言,微信后台留言可能回复得不及时。

 

博客地址为:https://www.cnblogs.com/icparadigm/

 

[342] 什么是亚稳态?亚稳态是如何产生的?它有什么影响?

亚稳态是一种电路状态,在电路正常工作所需的时间内,电路无法稳定在的“ 0”或“ 1”逻辑电平的状态。通常在建立时间和保持时间违例时发生。

 

亚稳态可能会导致:

 

  1. 不可预测的系统行为。不同的扇出可能得到不同的信号值,从而导致设计进入未知状态。如果不稳定的数据(“ 0”或“ 1”)传播到设计中的不同部分,则可能导致高电流并最终芯片烧坏。

 

[343] 如何避免亚稳态?

通过在设计中使用同步器,可以避免跨时钟域时的亚稳态。同步器让信号有足够的时间从不稳定的振荡(“ 0”和“ 1”)稳定下来,从而获得稳定的输出。对于跨时钟域时可能出现的亚稳态,还可以使用包括握手机制、异步 FIFO 等方法。对于同步电路中,要进行合理的设计与设计约束,避免建立时间和保持时间违例。

 

[344] 同步器的构成是怎样的?

以下是一个同步器电路的例子。这是一个两个触发器同步器,第一个触发器等待一个时钟周期,使输入端的亚稳态稳定下来 / 逐渐消失,然后第二个触发器在输出端提供稳定的信号。

 

 

值得注意的是,在信号输入第二级时,第一触发器的输出仍然可能不稳定(并导致第二级输出信号变为亚稳态)。在这种情况下,我们可以使用三个触发器同步器电路。但是,通常两个触发器同步器电路足以消除亚稳态,使用三个触发器的情况比较少。

 

[345] 什么是时钟门控?

时钟门控是一种低功耗技术,通过关闭了设计中某些部分的时钟达到降低功耗的目的。它是一种被用于控制时钟网络耗散功率的技术,通过避免不必要的开关活动,减少设计消耗的动态功耗。

 

[346] 什么是电源门控,为什么要使用它?

电源门控是一种低功耗设计,可以关闭设计中不工作的部分。当不工作时,电源门控可关闭电源,减少漏电功耗,从而降低了功耗。时钟门控有助于降低动态功耗,而时钟门控有助于降低静态功耗。

 

[347] 多时钟域设计会遇到哪些问题?

  • 亚稳性导致的同步失败:时钟在不同的时钟域中以不同的频率运行,并且在一个时钟域中生成的信号在非常接近第二个时钟域中时钟有效沿的位置采样时,输出可能进入亚稳态状态,在设计中出现同步失败。数据不一致:如果设计不合理,目标时钟域可能会接收错误的数据。例如:如果多个信号从一个时钟域传输到另一个时钟域,所有这些信号同时变化,并且源和目标时钟沿彼此接近,那么这些信号中的某些可能会在一个时钟中捕获,而有一些信号可能在另一个时钟周期中被捕获,从而导致数据不一致。注意:这只是数据不一致的一个例子, 数据不一致的产生还有很多原因。数据丢失:如果设计不合理,则数据可能会在 CDC 边界丢失。例如:如果信号从较快的时钟域送到较慢的时钟域,并且该信号的宽度仅等于一个时钟周期(较快的时钟),则可能会丢失以下信息:信号在较慢的时钟域中的采样沿前就变化了。注意:这只是数据丢失的一个例子, 数据丢失的产生还有很多原因。

 

[348] 如何处理跨时钟域信号?

跨时钟域处理有很多方法,具体取决于我们需要在不同的时钟域之间传递 1 位还是多位。假设以下情况:多个信号从一个时钟域传输到另一时钟域,所有信号同时变化,并且源和目标活动时钟沿彼此接近。在这种情况下,这些信号中的某些信号可能在目标时钟域的一个时钟周期中被捕获,而另一些信号在目标时钟域中的另一个时钟周期中被捕获,从而导致数据不一致性。可以使用下面方法在两个时钟域之间同步信号。

 

对于单 bit 跨时钟域:

  • 两级或者三级同步器使用握手信号进行同步

 

对于多 bit 跨时钟域:

  • 使用多周期路径的方法进行同步,将未经同步的信号和同步控制信号一起发射到目标时钟域对信号进行格雷码编码,由于相邻的格雷码计数只会变化 1bit,亚稳态的发生会大大减小使用异步 FIFO 将多比特信号合并成 1bit,然后再通过多级同步器进行传输

 

[349] 举例信号从快时钟域到慢时钟域可能发生的问题

信号只持续一个时钟周期(快时钟域),可能导致慢时钟域漏采样。

 

[350] 异步复位的优缺点有哪些?

优点:

  • 异步复位具有最高优先级。保证数据路径干净。在有或没有时钟信号的情况下都能生效。

 

缺点:

  • 如果在时钟的有效沿(或附近)撤销异步复位,则触发器的输出可能进入亚稳态。它对毛刺很敏感,可能导致虚假的复位。

 

[351] 同步复位的优缺点有哪些?

优点:

  • 整个电路都是同步的更加容易仿真综合以后可能会更加节省面积

 

缺点

  • 需要脉冲扩展,让复位脉冲足够长,保证能够正确地被采样会添加额外的组合逻辑同步复位需要时钟才能复位。如果电路具有内部三态总线,则需要单独的异步复位,以防止内部三态总线上的总线冲突。

 

[352] 什么是 Reset Recovery Time? 它和复位有什么关系?

复位恢复时间(Reset Recovery Time)是复位解除和时钟信号有效沿之间的时间。如果发生复位解除,并且在非常小的时间窗口内,如果时钟信号边沿来临,则可能导致亚稳态。这是因为复位解除置位后所有信号将不满足下一个触发器输入的时序条件。

 

[353] 什么是频率合成器?举一个频率合成器的例子?

频率合成器是一种可以从单个稳定参考频率生成新频率的电路。例如:为了从参考 100 MHz 时钟信号生成 200MHz 时钟信号,PLL 通常用作频率合成器。

 

[354] 什么是 PLL?

PLL 全称是“Phase Locked Loop,锁相环”。简而言之,它是一种反馈电路(准确地说是控制系统),用于生成输出信号,该输出信号的相位与输入信号的相位有关。它用于相位 / 频率调制和解调,还可以用作频率合成器。PLL 由三个功能块组成:

 

  • 鉴相器环路滤波器压控振荡器

 

[355] 画出 PLL 的框图

 

 

这里是参考频率,是输出频率,这样,这意味着

 

覆盖率

[356] 代码覆盖率与功能覆盖率的区别是什么?

代码覆盖率:代码覆盖率是一种度量,用于度量给定测试 case 对设计代码(HDL 模型)进行测试的程度。启用后,模仿真器会自动提取代码覆盖率。

 

功能覆盖率:功能覆盖率是用户定义的度量标准,用于度量已执行了多少 spec(如测试计划中的功能所列举的)。它可以用来衡量对于 spec 的测试充分性。它是用户定义的,不会自动生成。它也不依赖于设计代码,因为它是根据 spec 实现的

 

[357] 代码覆盖率有哪几种?

  • Statement/Line coverage:用于衡量在仿真测试期间测试了多少条语句(行)。一般行覆盖率的目标是 100%。在下面的代码中,有 4 行或语句将在 Statement/Line coverage 中进行收集。

 

always @ (posedge clk) begin
    if( A > B) begin //Line 1
        Result = A - B; //Line 2
    end else begin //Line 3
        Result = A + B; //Line 4
    end
end

 

  • Block coverage:在 begin-end 或 if else 或 case 语句之间或 while 循环或 for 循环之间的一组语句称为块。块覆盖率衡量的是在仿真过程中是否覆盖了这些类型的块码。块覆盖范围看起来类似于语句覆盖范围,不同之处在于块覆盖率包含了一组语句。在下面的的示例代码中,有三个代码块

 

always @ (posedge clk) begin //always block
    if( A > B) begin // if block
        Result = A - B;
    end else begin // else block
        Result = A + B;
    end
end

 

Branch/Decision coverage:分支覆盖率评估 HDL 代码中的条件,例如 if-else,case 语句和三元运算符(?:)语句,并检测是否同时包含真假情况。在上面的示例中,只有一个分支(if A> B),分支覆盖率会检查是否真假两个分支都被触发了。

 

Conditional Coverage and Expression coverage:条件覆盖率会检查 HDL 中的所有布尔表达式,并计算该表达式为真或假的次数。表达式覆盖率检查语句的右侧,统计所有可能组成的真值表的覆盖程度。以下是包含 3 个布尔变量的表达式,它们决定了 Result 变量为 true 或 false

 

Result = (A && B) || (C)

 

针对 A,B 和 C 的所有可能情况,如下创建真值表。条件覆盖率可以衡量此真值表的所有行是否都被覆盖。

 

 

  • Toggle coverage:翻转覆盖率可衡量仿真运行期间设计中信号和端口的翻转率。这有助于识别哪些信号一直没有翻转。FSM coverage:状态机覆盖衡量仿真期间是否所有状态机的状态都被覆盖到。

 

[358] 如果功能覆盖率接近 100%而代码覆盖率不足 60%,说明了什么?

仿真器会基于 testcase 提取代码覆盖率,而功能覆盖率则是用户定义的指标。低代码覆盖率表明并非设计代码的所有部分都经过了测试。高功能覆盖率表明,用户从测试计划中捕获的所有功能都得到了测试。如果覆盖率指标显示低代码覆盖率和高功能覆盖率,原因可能是:

 

  1. 可能有许多设计代码未按照 spec 用于实现的功能。(无效的代码)用户定义的功能覆盖率量中存在一些错误。测试计划未捕获所有设计功能 / 场景 / 边界,或者缺少功能覆盖率监视器。代码覆盖率中未覆盖的设计代码可能会映射到这些功能上。在实现功能覆盖率监视器时可能存在潜在的错误,导致它们收集了错误的覆盖率。因此,在验证项目中,对用户定义的功能覆盖率指标及其实现进行适当的检查很重要。

 

[359] 如果代码覆盖率接近 100%而功能覆盖率不足 60%,说明了什么?

  1. 没有按照 spec 在设计中实现了所有功能。因此,设计代码无法实现所有功能在功能覆盖率监视器中可能存在潜在的错误,即使设计代码实现了功能,也无法覆盖它们。功能正确,但是由于发送的激励不正确,对应的功能覆盖率无法收集。

 

[360] 覆盖组可以在类内部定义和使用吗??

是的,可以在类内部定义覆盖组。这对于基于测试平台结构(例如事务,序列,检查器,监视器等)实现功能覆盖率非常有用。