推荐答案
测试一下
题目
reg signed [0:4]c ; c=8'sh8f; 赋值后c的值是多少?
A. 15
B. 17
C. -15
参考答案与知识点
参考答案
正确答案是 A.15。
解析:首先,`reg signed [0:4] c` 定义了一个5位有符号寄存器,位序为[0:4],即最高位是0,最低位是4,但位序不影响数值,该寄存器可表示范围-16~15(补码)。赋值表达式 `c=8'sh8f` 中,`8'sh8f` 是8位有符号十六进制数,二进制为1000_1111。作为8位有符号补码,其值为-113(因为最高位为1,取反加1得0111_0001=113,加负号)。赋值给5位目标时,Verilog直接截取低5位(即位4~0):1000_1111的低5位是0_1111(b4=0, b3=1, b2=1, b1=1, b0=1)。这5位二进制01111作为有符号数,最高位(b4)为0,表示正数,数值为15。因此c的值为15。
易错点:有符号数赋给更小位宽时,直接截断高位,不会进行符号扩展;且截断后新的最高位决定符号。若误认为符号位保留(如认为-113的低5位是负数),则会错选-15(对应二进制11111,即-1?实际5位11111是-1,而非-15)。5位补码-15的二进制是10001,与截断结果01111不符。选项B的17(10001)也是干扰项。
涉及知识点
- Verilog有符号数赋值截断规则
- 有符号数的补码表示与位宽转换
- Verilog的'sh语法带符号十六进制
- 向量位序与数值无关
- 不同位宽有符号数赋值时的符号位处理