热度 12
2013-12-31 09:59
1604 次阅读|
0 个评论
今天有一个学弟问我 Verilog 中 reg(或 wire)是否加 signed 关键字的区别。回答他之后,总结如下。其实, 两者的区别和计算机中有符号数和无符号数的区别是完全一致的 。 添加 signed 关键字的 reg(或 wire)与不添加 signed 关键字的 reg(或 wire),主要有以下三点不同。 有符号右移 对于普通的右移(),是否加 signed 是没有区别的,第一位都是补 0 。 有符号右移()就有区别了,有符号数是补和符号位相同的值,无符号数是补 0 。 例如: 以下是代码片段: reg unsignedRegA; reg signed signedRegA; initial begin unsignedRegA = 6'b110000; signedRegA = 6'b110000; unsignedRegA = unsignedRegA2; signedRegA = signedRegA2; end 这段程序运行后, unsignedRegA 为 6'b001100, signedRegA 为 6'b111100。 减法 加法应该是没区别的,区别在减法。无符号数是做二进制减法,有符号数是将减数取补再做加法。前者符合将数视为无符号数时的结果,后者符合将数视为有符号数(补码)时的结果。 例如: 以下是代码片段: reg unsignedRegA; reg unsignedRegB; reg unsignedRegS; reg signed signedRegA; reg signed signedRegB; reg signed signedRegS; initial begin unsignedRegA = 6'b111000; unsignedRegB = 6'b000110; signedRegA = 6'b111000; signedRegB = 6'b000110; unsignedRegS = unsignedRegA-unsignedRegB; signedRegS = signedRegA-signedRegB; end 这段程序运行后, unsignedRegS 为 7'b0110010 (56-6=50), signedRegS 为 7'b1110010 (-8-6=-14)。 比较 比较的区别很明显。 对于有符号数,符号位为 1 的数是负数,显然小于符号位为 0 的正数。 对于无符号数,没有符号位,对应的比特是 MSB 。显然, MSB 为 1 的数要大于 MSB 为 0 的数。 例如: 以下是代码片段: reg unsignedRegA; reg unsignedRegB; reg signed signedRegA; reg signed signedRegB; reg unsignedCompare; reg signedCompare; initial begin unsignedRegA = 6'b111000; unsignedRegB = 6'b000110; signedRegA = 6'b111000; signedRegB = 6'b000110; unsignedCompare = (unsignedRegAunsignedRegB) ? 1'b1 : 1'b0; signedCompare = (signedRegAsignedRegB) ? 1'b1 : 1'b0; end 这段程序运行后, unsignedCompare 为 1'b1, signedCompare 为 1'b0 。 总结 总之,如果涉及负数,就一定加上 signed 。否则如果涉及上面三种运算,就会跟想象的不一样。