姜咏江
计算机的位长是固定的,在使用硬件描述语言进行CPU设计时要特别注意。假如你定义了16位数据长度的运算器,要比较两个数的大小,用EDA语言描述时就会出现预想不到的结果。
例如,要比较有符号数16’he0a0与16’h60a0的大小,显然前者是一个负数,会小于后者。但当你用Verilog HDL进行比较时,就会得出前者大于后者的结论。这是为什么?原来我们使用的计算机是32位的,不论你设计的位长是多少,都要变成32位数到处理器中进行比较。因而比较之前要先将这两16位数扩充成32位数。由于Verilog HDL认定扩充位数前面“添0”,故而会得出有符号的16’he0a0 > 16’h60a0的结论。
此例在32位Verilog HDL中做减法,会得到差为32’h00008000,其中的变化过程是:
16’he0a0 - 16’h60a0 => 32’h0000e0a0 – 32’h000060a0
=>32’h0000e0a0+32’hffff9f60 =>32’h00008000
依据最高位是“0”,因而判断出有符号数16’he0a0 > 16’h60a0。
按着限位数正负数判断和扩充位数方法,16’he0a0是负数,因而扩充成32位应是32’hffffe0a0。所以用32位计算机比较这两个16位正负数大小用减法应是:
16’he0a0 - 16’h60a0 => 32’hffffe0a0 – 32’h000060a0
=>32’hffffe0a0+32’hffff9f60 =>32’hffff8000
用这种方法才能正确地比较出不足32位正负数的大小。
2010-9-25
https://wap.sciencenet.cn/blog-340399-366592.html
上一篇:
精确浮点运算需要监控的信号下一篇:
好想有一个真正的计算机核心科技讨论会