Altifigence Academy

5 / 37 · 概念

logic、wire、X/Z 与明确的位宽

区分类型声明与存储器件,检查常量、比较、扩展和未知值。

类型、驱动源和存储是不同问题

logic 是四态数据类型,wire 表示 net 连接,net 也可传递四态值。logic 变量在驱动规则允许时可用于组合结果或时钟状态,名称本身不保证触发器。找出实际连续赋值、组合过程或边沿过程。普通 RTL 信号使用一个预期驱动源;解析多驱动 net 与双向接口需另立电气和工具契约,不在这些单驱动例子的范围内。

明确位宽与解释

logic [7:0] u 是无符号 8 位,logic signed [7:0] s 是以二进制补码解释的同样 8 位。8'hFF 在 u 中是 255,在 s 中是 −1。packed 向量同时传递位,不是时间上连续的八个值。

SystemVerilog
module typed_examples (
  input  logic [3:0] a, b,
  input  logic signed [7:0] s,
  output logic [4:0] full_sum,
  output logic signed [8:0] extended_s,
  output logic negative,
  output logic any_bit, all_bits, parity
);
  assign full_sum = {1'b0, a} + {1'b0, b};
  assign extended_s = {s[7], s};
  assign negative = s < 8'sd0;
  assign any_bit = |a;
  assign all_bits = &a;
  assign parity = ^a;
endmodule

extended_s 重复符号位。只添一个 0 会把 −1 变成 +255。连接表达式是无符号的,对其做有符号算术要显式转换或用正确声明的中间值;这里把预期位模式赋给有符号目标。依赖位宽时使用 4'd15、8'hFF、8'sd0 这样的定宽常量。未定宽整数可扩展表达式,不能假定左操作数决定全部类型,要检查两端及赋值上下文。

区分三类运算符

a & b 按位运算,a && b 判断两个向量是否逻辑为真并返回一位,&a 判断所有位是否为 1。a=0011,b=0101 时依次为 0001、1、0;^a 是奇偶校验,0011 得 0。把不清楚的宽度或符号拆成中间信号,便于给每个信号规定范围。

未知不是第三种物理电压

X 表示未知,Z 表示高阻驱动,都是仿真值,不对应某个准确电压。二态执行不能证明四态行为。不要把所有 X 隐藏成 0,应在四态测试平台中明确复位。== 在无法判断时可能得到 X;测试中的 actual !== expected 能把已知期望与 X/Z 的比较判为明确不匹配。case equality 不意味着普通硬件能检测物理 X。

练习:扩展、加法与比较

a=15,b=1 时 full_sum=10000。s=8'h80 时 extended_s=110000000,negative=1;s=8'h7F 时 extended_s=001111111,negative=0。分别测 0、最大正数、最小负数、−1。改成 {1'b0,s} 并确认负数测试失败。把 !== 改成 !=,向 actual 注入 X,观察条件是否可靠报告失败;检查结果本身未知可能漏报。

你的选择适用于此浏览器,可随时在页脚更改。