一个verilog 的位宽限定问题
时间:12-12
整理:3721RD
点击:
此话怎讲?
如果需要做带符号数的比较,可以定义为“signed", 那么TB中出现的数就直接用默认的十进制表示,例如你可以得到“-2048” 确实小于 "某信号”(它被赋值为“-2047”)。我觉得这样比较直观而且简单。这就是为什么LZ应该把所有的“16'd"去掉。
另一种也可以不用定义是"signed", 默认的“unsigned"也可以进行带符号的比较,不过这就需要将所有的数值该写为这样的格式“-16'dxxx", 也的确能得到"-16'd2048<-16'd2047", 这就需要LZ将TB中那个 “-700”也改为“-16'd700",
LZ, 你可以试一试,是否第二种也可以pass, 不是的话你好好debug一下,不是什么太深奥的东西。
这是一个符号数与无符号数的内码转换问题,比如c语言,当你要比较一个有符号数与一个无符号数时该怎么办?一般来说会将后者0扩展后转化为一个有符号进行比较,用户只需要注意这种转化之间是否会有溢出。对于verilog,这种“〉“在处理两边数据类型不一致时会怎么处理可能需要你查查标准,你也可以打印-16'd2047的内码来看看它内部的一些转换。你要知道的是:有符号数用补码存放,无符号数用原码,用“〉”进行比较时,内部实现往往是无符号数赋给一个有符号的临时变量后再比较。
这种一个表达式里面兼有signed和unsigned的情况,仿真器把他们全翻成unsigned,然
后再比较
-16'd2047是个unsigned,-2047是signed
如果你写成$signed(-16'd2047),应该也正确