当前位置:   article > 正文

刷完这套题,我才发现Verilog原来如此简单----HDLBits答案系列 -- Finding bugs in code_finding bugs in code实验目的

finding bugs in code实验目的

写在前面

全部答案汇总:刷完这套题,我才发现Verilog原来如此简单----HDLBits答案汇总

今天更新Circuits章节中Verification:Reading Simulation的1个小节:Finding bugs in code

这个章节主要是找代码的bug,建议先看代码找BUG,如果是在看不出来,可以直接仿真,看仿真出来的波形跟需求波形差在什么地方,从而针对性的进行分析。


Mux

题目:

        下面的8位宽二选一选择器不工作了,请修复它。

个人思路:

        out是选择器输出的结果,肯定是输入之一,那么位宽应该是8位的。因为sel是1位宽的,所以不能这样和输入做位与运算,如果输入也是1位宽的话,那么这个代码这么写没问题。

  1. module top_module (
  2. input sel,
  3. input [7:0] a,
  4. input [7:0] b,
  5. output [7:0] out );
  6. assign out = sel ? a : b;
  7. endmodule

NAND

题目:

        下面3输入与非门不工作了,请修复它。

        你必须使用下面提供给你的5输入与门。         

        module andgate ( output out, input a, input b, input c, input d, input e );

个人思路:

        它例化这个五输入的与门没有例化对,输入信号没有对好。

        因为是3输入的模块,所以多出来的信号应该用1(一个数与上1都是这个数本身,等于没有操作)代替,例化完了后因为被例化的是与非门,所以输出还需要取反。

  1. module top_module (input a, input b, input c, output out);//
  2. wire out1;
  3. andgate inst1 ( out1, a, b, c, 1'b1,1'b1 );
  4. assign out = ~out1;
  5. endmodule

Mux

题目:

        下面的四选一选择器不工作了,请修复它。

        你必须使用下面的二选一选择器:   

                module mux2 (
                    input sel,
                    input [7:0] a,
                    input [7:0] b,
                    output [7:0] out
                );

个人思路:
       mux0、mux1应该是8位宽的,这样位宽才匹配;其次c、d的选择应该是使用sel[0]。 

  1. module top_module (
  2. input [1:0] sel,
  3. input [7:0] a,
  4. input [7:0] b,
  5. input [7:0] c,
  6. input [7:0] d,
  7. output [7:0] out ); //
  8. wire [7:0] mux0, mux1;
  9. mux2 inst1 ( sel[0], a, b, mux0 );
  10. mux2 inst2 ( sel[0], c, d, mux1 );
  11. mux2 inst3 ( sel[1], mux0, mux1, out );
  12. endmodule

Add/Sub

题目:

        下面的加法器/减法器不工作了,请修复它。

个人思路:
        这个一看代码,就发现if语句后面没有else语句,所以会生成锁存器,标志信号被电平触发后会一直保持在高电平状态,所以应该补全if--else语句。

  1. // synthesis verilog_input_version verilog_2001
  2. module top_module (
  3. input do_sub,
  4. input [7:0] a,
  5. input [7:0] b,
  6. output reg [7:0] out,
  7. output reg result_is_zero
  8. );//
  9. always @(*) begin
  10. case (do_sub)
  11. 0: out = a+b;
  12. 1: out = a-b;
  13. endcase
  14. if (!out)
  15. result_is_zero = 1;
  16. else
  17. result_is_zero = 0;
  18. end
  19. endmodule

Case statement

题目:

        这个组合电路应该可以识别8位键盘扫描码的0到9按键。它应该指示10个分支中是否有一个被识别(有效),如果是,那么哪个按键被检测到。请修复bug。 

个人思路:

        乍一看该有的都有,那么就直接仿真,结果如下:

        结合代码,很容易发现有两个分支是明显错的,一个位宽为6,一个是10进制单位,分别修改( 8‘d26----8'h26;6'h46----8'h46)后:

        可以看到:该输出0的时候,我们写的模块输出还是上一个输出,说明生成了锁存器,那么肯定是case语句没有写全;另一个问题是valid的输出一直是0,结合代码发现 valid没有写道case分支中去。那么就可以改动代码如下(最终版):

  1. module top_module (
  2. input [7:0] code,
  3. output reg [3:0] out,
  4. output reg valid
  5. );
  6. always @(*)begin
  7. case (code)
  8. 8'h45: begin out = 0;valid =1;end
  9. 8'h16: begin out = 1;valid =1;end
  10. 8'h1e: begin out = 2;valid =1;end
  11. 8'h26: begin out = 3;valid =1;end
  12. 8'h25: begin out = 4;valid =1;end
  13. 8'h2e: begin out = 5;valid =1;end
  14. 8'h36: begin out = 6;valid =1;end
  15. 8'h3d: begin out = 7;valid =1;end
  16. 8'h3e: begin out = 8;valid =1;end
  17. 8'h46: begin out = 9;valid =1;end
  18. default:begin out = 0;valid =0;end
  19. endcase
  20. end
  21. endmodule

       

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/648835
推荐阅读
相关标签
  

闽ICP备14008679号