Altifigence Academy

18 / 63 · 概念

比较器与边界值规格

区分同一位串的 unsigned 与 signed 比较,验证边界条件。

大小关系由最高的不同位决定

从 MSBMSB 权重最高的比特。其索引取决于向量声明方向,不能总认为它是编号最大的位。了解更多 开始比较两个 unsignedunsigned 将位串解释为非负整数的规则。n 位范围为 0 到 2^n−1,可能与同一位串的 signed 解释不同。了解更多 向量,找到第一个不同位;该位为 1 的数较大。令 ei=ai⊕bi‾e_i=\overline{a_i\oplus b_i},则四位大于条件如下。

gt⁡(a,b)=a3b‾3+e3a2b‾2+e3e2a1b‾1+e3e2e1a0b‾0\operatorname{gt}(a,b)=a_3\overline b_3+e_3a_2\overline b_2+e_3e_2a_1\overline b_1+e_3e_2e_1a_0\overline b_0

左侧的 gt⁡(a,b)\operatorname{gt}(a,b) 是表示比较结果的布尔值。只有所有更高位相同,低位比较才影响结果。相等比较则是所有 eie_i 的 AND。

signed 比较先解释符号

4'b1111 与 4'b0001 按 unsigned 解释分别为 15 与 1,按 signed 解释则为 -1 与 1。符号不同时,负数更小。logic [3:0] 与 logic signed [3:0] 的区别不是存储容量,而是运算采用的解释。

SystemVerilog
logic [3:0] a, b;
logic unsigned_lt, signed_lt;
assign unsigned_lt = a < b;
assign signed_lt = $signed(a) < $signed(b);

这段代码针对两个操作数位宽相同的情况。位宽不同时,不能只做简单类型转换,应先决定扩展到哪种位宽。

同样的两个位串,在不同符号约定下可能具有相反的大小关系。不要将 unsigned 的高位优先比较规则直接套用到 signed 数值。

比较位串之前先确定解释
  1. 1111 vs 0001: 相同的四位输入
  2. Unsigned: 15 大于 1
  3. Signed: −1 小于 1

用明确语句固定边界条件

缓冲区可存储 16 项时,count==16 表示满,count<16 表示还能存入。如果 count 只有四位,便无法表示 16,满条件本身就会失效。因此必须同时检查比较器功能与被比较值的表示范围。

对于阈值 TT,优先检查 T−1,T,T+1T-1,T,T+1,但超出表示范围的值需单独处理。测试应刻意区分 < 与 <=。若只比较 unsigned 回绕后的值,就无法恢复已经丢失的进位。

自己试试

表示 0~16 占用量的 FIFO 计数需要多少位?满状态下能否同时允许 pop 与 push,仅凭比较表达式就能决定吗?

阅读解释

需表示 17 个值,因此要五位。同时发生 pop 时能否在空出的位置接收 push,由接口策略决定。只使用 count < 16 可能阻止满状态下的同时交换;若允许交换,还必须考虑 pop 实际被接受的条件。

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