verilog中,都是以补码表示(在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。),布尔类型的0和1本来是没有符号的,人为认为最高位为符号位,且NC-verilog也会把数当成有符号数。硬件设计中,当进行无符号数运算的时候,扩展最高位,结果截断位32位(32位数位例),然后人为看成无符号数。(个人理解) 1、溢出判断 用变形补码进行双符号位运算(正数符为00,负数符号以11) 若运算结果的符号位为"01",则上溢; 若结果双符号为10,则下溢出; 若结果的双符号位为00或11,无溢出。 2、大小判断 两个32位数,例:[31:0] src1和src2; assign Equal = (src1== src2); wire [32:0] Dst_S; assign Dst_S = {src1[31],src1} - {src2[31],src2} if( !Equal && !Dst_S[32] ) 则src1 > src2; 注:1、两数相减不会溢出,判断Dst_S的最高位为0,则可以知道结果为整数,即大于。 2、此处用减法来比较大小,是为了共用加法器。