主页网站建设,校园网站管理系统,wordpress实现动漫播出时间表,建立销售型网站笔者之前在阅读《Verilog HDL 高级数字设计》时的基4布斯乘法器一文时#xff0c;就遇到了一段有问题的代码#xff0c;而这个问题可以用Verilog基础#xff1a;表达式位宽的确定#xff08;位宽拓展#xff09;文中的分析完美解决。
always (negedge clock) if (Start)… 笔者之前在阅读《Verilog HDL 高级数字设计》时的基4布斯乘法器一文时就遇到了一段有问题的代码而这个问题可以用Verilog基础表达式位宽的确定位宽拓展文中的分析完美解决。
always (negedge clock) if (Start) begin expected_value 0; case({word1[word_size-1], word2[word_size-1]})0: begin expected_value word1 * word2; expected_mag expected_value; end1: begin expected_value word1* {All_Ones,word2[word_size-1:0]}; expected_mag 1 ~(expected_value); end2: begin expected_value {All_Ones, word1[word_size-1:0]} *word2;expected_mag 1 ~(expected_value); end 3: begin expected_value ({All_Zeros, 1 ~word2[word_size-1:0]}) * ({All_Zeros, 1 ~word1[word_size-1:0]});expected_mag expected_value; endendcase 上面的代码片作用是根据word1和word2的不同算出乘积结果的数值大小和结果的数值绝对值大小。即当两个数都是负数时即case 3对两个数都整体取反加一变成正数对于一个补码获取其相反数补码的操作是对整体取反加一包括符号位然后相乘获得结果。但是里面存在问题就是word的片选在取反之前会先补零拓展至32位因为不带位宽的1是32位的根据位宽拓展原则和~这两个操作符都是上下文决定操作符因此会先将word2[word_size-1:0]补零拓展任何信号的片选都是无符号数至32位此时再取反就会变成一个很大的正数因此会出错。 对于比如8位有符号数-128和-127按照上面转换后理想情况是128*127但是因为错误的位宽拓展结果变成了4294967168*4294967167。 解决这个问题的方法很简单将1改成1b1即可阻止不必要的位宽拓展或者用{}拼接操作符包围~word2[word_size-1:0]因为所有在{}符号内的操作数都会变成自决定操作数位宽由自己决定而不加入上下文环境中如下所示的为正确的代码。
always (negedge clock) if (Start) begin expected_value 0; case({word1[word_size-1], word2[word_size-1]})0: begin expected_value word1 * word2; expected_mag expected_value; end1: begin expected_value word1* {All_Ones,word2[word_size-1:0]}; expected_mag 1b1 {~(expected_value)}; end2: begin expected_value {All_Ones, word1[word_size-1:0]} *word2;expected_mag 1b1 {~(expected_value)}; end 3: begin expected_value ({All_Zeros, 1b1 {~word2[word_size-1:0]}}) * ({All_Zeros, 1b1 {~word1[word_size-1:0]}});expected_mag expected_value; endendcase 上面的代码中两种改正措施都实现了实际上只需要其中一种即可。更多关于Verilog表达式位宽拓展和符号拓展相关的问题可以查看下面的文章。
Verilog基础表达式位宽的确定位宽拓展https://blog.csdn.net/weixin_45791458/article/details/128772558?spm1001.2014.3001.5502Verilog基础表达式符号的确定https://blog.csdn.net/weixin_45791458/article/details/128840843?spm1001.2014.3001.5502