25 / 63 · 实验
实验:MUX 的穷举检查与寄存输出分析
将相同输入施加到组合路径与寄存器路径,利用真值表与采样时刻验证结果。
课时内容可免费阅读,选课后可保存学习进度。
实验对象与观察条件
sel=0 时 y 输出 a,sel=1 时输出 b。sampled_y 在时钟上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多存储 y。即使输入变化,sampled_y 也保持到下一个上升沿。
开始之前
准备 Digital Design Studio 的 Desktop 项目,并确保具备运行权限。将各示例分别保存到独立文件夹中的 rtl/top.sv。
先构造 a 与 b 不同的组合。确认 sel=0 时输出 a、sel=1 时输出 b,再与输入文件的每一行对照。
y = sel ? b : a
SystemVerilog 源码
module top (
input logic clk,
input logic a,
input logic b,
input logic sel,
output logic y,
output logic sampled_y
);
assign y = sel ? b : a;
// Explicit observation register: y remains purely combinational.
// The register makes this design eligible for logic-netlist-1 simulation.
always_ff @(posedge clk) sampled_y <= y;
endmodule运行方法
在 New analysis 中选择 Two-state single-clock v1。Clock port 设为 clk,周期为 1000ps。使用以下设置完成 Preflight,再执行 Run RTL simulation 并比较结果。
| 设置 | 值 |
|---|---|
| 初始寄存器值(从 LSB 开始) | [false] |
| Reset port | 留空 |
| Maximum cycles / time | 8 / 8000ps |
每列对应下方输入文件的一项。组合输出 y 的预期值为 0,0,0,1,1,0,1,1。此图只按输入顺序预测功能,不包含 sampled_y 的更新时间。
查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| a | 0...1... | |
| b | 0.1.0.1. | |
| sel | 01010101 | |
| y expected | 0..1.01. |
输入激励
[
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
false
],
"b": [
true
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
false
],
"sel": [
true
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
false
]
}
},
{
"inputs": {
"a": [
true
],
"b": [
true
],
"sel": [
true
]
}
}
]比较结果
8 cycles · y=1 · sampled_y=1。检查在 3000ps 时,是否 y=1 而 sampled_y=0。
本实验使用 0/1 单时钟 RTL,不包含 #delay、initial 或 X/Z 测试平台。学习完成标记只记录学习进度,不代表实际仿真结果。
先写出预期结果
运行模拟器之前,亲自计算上述输入顺序的组合输出 。预期位序列为 。它检查了全部八种输入组合,比只确认一个最终值更有说服力。
寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多输出在上升沿更新,而不是在输入激励变化的瞬间更新。请分别记录边沿前的组合输出和边沿后的寄存器输出。
这里用第 个边沿采样的输入定义边沿后的状态 。信号名 sampled_y 对应这一状态。即使显示在同一时间坐标上,也必须确认输入施加与寄存器更新的事件顺序。
用三项检查区分缺陷
- 选择反相:改为
sel ? a : b之前,先预测最早失败的是哪个向量。 的向量无法发现此错误。 - 混淆观察点:解释为什么把
sampled_y当作y,立即与组合参考值比较,会使正常电路看起来也失败。 - 输入保持检查:只改变未选中的输入,确认 保持不变;改变所选输入时, 应随之变化。
在错误报告中逐项记录输入、观察时刻、预期值和实际值。只写“波形异常”,无法区分选择逻辑错误与一个周期的延迟。
扩展任务
将数据位宽扩为四位后,组合输入空间为 种,仍可穷举。但应先用 0、最大值、0101、1010 以及 walking-one 模式快速暴露位位置错误。修改位宽后,也要同步更新电路设置与输入文件。
自己试试
在上升沿存储 对应的值后,在下一边沿前只把 改为 1。求逻辑延迟过后的 ,以及下一个上升沿前后的 sampled_y。
阅读解释
组合输出 。sampled_y 在下一个上升沿前保持为 0,并在该边沿存入 1。这个比较假设输入在采样所需的时间内保持稳定。