SystemVerilog文本宏`define中检测操作数signed/unsigned属性的方法
Verilog符号类型检测与取反宏优化方案
当前代码存在的问题
你当前的实现有三个核心问题:
- 宏定义语法错误:宏名
negation和参数括号之间不能加空格,否则编译器会把(a)识别为宏体的一部分,无法正确解析参数 - 判断逻辑不可靠:
(a<0 || -a<0 || (a-1)<0)的判断规则和Verilog的类型隐式转换规则冲突,不同位宽的操作数传入时容易出现误判,还会引入冗余的比较逻辑 - 无符号返回值不符合需求:代码里返回的
1是默认32位的数值1,只有最低位为1,和你要求的返回全1'1的需求不符
最优实现方案
现在绝大多数FPGA、ASIC开发工具都支持SystemVerilog语法,直接调用IEEE标准定义的$issigned()系统函数即可检测操作数的符号属性,该函数仿真和综合都支持,判断逻辑完全符合标准类型规则,没有歧义。
优化后的宏定义如下:
`define negation(a) ($issigned(a) ? -a : '1)
Verilog-2001兼容方案
如果你的工程只能使用Verilog-2001标准,不支持$issigned(),可以利用无符号数恒不小于0的规则实现判断,注意使用1位有符号0避免位宽转换导致的判断错误:
`define negation(a) ((a < 1'sb0) ? -a : '1)
注意事项
- 传入宏的操作数避免出现隐式位宽扩展,否则可能触发非预期的符号类型转换
- 有符号数最小负值(比如4位有符号数的-8)取反会出现溢出,这是二进制补码本身的特性,不属于逻辑错误
内容的提问来源于stack exchange,提问作者Yunsung Mo
相关产品推荐
相关产品推荐

