我遇到verilog模块的问题,我需要检查一个固定点数是否在设定范围内,但我有意想不到的行为。这是我想要完成的简化版本:
reg signed [4:0] signedmaxBound = 5'sb01010; // 10
reg signed [4:0] currentValue = 5'sb00000; // 0
if (currentValue > -maxBound & currentWeight < maxBound)
// Execute Code
我只想知道这段代码是否能完成预期的任务(我已将问题排除在包含此代码的模块中)。我不确定-maxBound是否会正确执行二进制补码操作以表示负值。
此外,我不确定比较器操作员是否生效。即,在这种简化格式中,10由01010表示,-15由10000表示。 -15然而01010不大于10000。
答案 0 :(得分:2)
您的问题是您使用的是逐位&
运算符而不是逻辑&&
运算符,它的优先级高于关系运算符。那么你所写的东西被解释为
(currentValue > ((-maxBound) & currentWeight)) < maxBound)
这不是你想要的。你想要
(currentValue > -maxBound && currentWeight < maxBound)
被解释为
(currentValue > (-maxBound)) && (currentWeight < maxBound)
关系运算符会查看其操作数的签名 - 它们都需要签名才能进行签名比较。