HDLBits刷题笔记

今天在刷题的时候遇到一些神奇的错误/技巧:
Exams/m2014 q4j中,

genvar i;
generate
    for (i=1;i<3;i++) begin:adder
        add u
        (
            .a    (x[i]      ) ,
            .b    (y[i]      ) ,
            .cin  (c[i-1]    ) ,
            .cout (c[i]      ) ,
            .sum  (sum[i]    ) 
        );
    end
endgenerate

在使用generate例化模块的时候,如果将模块名改为x(因为输入变量就叫做x),似乎不会有语法错误,但是最后的结果是有问题的。

在半加器那块儿,发现你可以将{a,b} = c + d + e;,这样的表达式先计算后面的值,然后先满足a的位宽,然后再赋给b(应该吧)!!我下去再试试!!

之后在判断是否溢出的时候复习了一下大二上学期数电的内容,发现隐约记着点什么:
然后上网查询,找到了这个办法!!
双符号位判断。所谓双符号位,就是在正数前补0,在负数前补1,即00表示正号,11表示负号。如果进位将会导致符号位不一致,从而检测出溢出。结果的符号位为01时,称为上溢;为10时,称为下溢。

如:62h+63h=00 1010010+00 1010011=01 0100101,符号位为01,上溢。
如:f0h+88h=11 1110000+11 0001000=110 1111000,符号位为10,下溢。

刚开始写的时候还以为是符号位有1就算是溢出,发现仿真结果不对,最后对照结论和二进制计算器才发现,符号位不一致才算是溢出!

posted @ 2022-08-09 23:50  xing-uestc  阅读(99)  评论(0)    收藏  举报