• VL1_四选一多路器(完整RTL、Testbench和覆盖率)


    写在前面

    1. 这个专栏的内容记录的是牛客的Verilog题库刷题。
    2. 牛客算是一个Verilog宝藏刷题网站了,网站提供在线仿真环境,不用自己找题(点击直达),<刷题记录>专栏,持续打卡中…


    一、题目

    1. 题目描述

    制作一个四选一的多路选择器,要求输出定义上为线网类型


    2. 状态转换

    信号二进制码
    d011
    d110
    d201
    d300

    3. 信号示意图

    在这里插入图片描述


    4. 波形示意图

    在这里插入图片描述


    5. 输入描述

    输入信号d0d1d2d3sel
    类型wirewirewirewirewire

    6. 输出描述

    输出信号mux_out
    类型wire

    二、分析

    由波形图可以得到下面的表格

    信号片选值mux_out
    sel2’b00d3(2‘b10)
    sel2’b01d2(2’b01)
    sel2’b10d1 (2’b00)
    sel2’b11d0 (2‘b11)

    在这里插入图片描述

    软件思想上,有两种实现方法,一是使用if-else,二是使用case语句。实际对应的电路实际上都是数选器。

      实现的方式有三种,一是使用四输入查找表case方式;二是使用if-else if-else;三是使用两个二输入的查找表方式,此方法使用的资源一样,但是速度提升一倍(如果if-else if-…过长,也可以使用类似的方法进行分割,利用并行执行的特点进行优化。)


    三、RTL

    `timescale 1ns/1ns
    module mux4_1(
      input [1:0] d0  ,
      input [1:0] d1  ,
      input [1:0] d2  ,
      input [1:0] d3  ,
      input [1:0] sel ,
    
      output [1:0] mux_out
    );
    
    reg [1:0] mux_out_tmp;
    
    always @ (*)begin
    	case(sel)
         2'b00: mux_out_tmp = d3;
         2'b01: mux_out_tmp = d2; 
         2'b10: mux_out_tmp = d1; 
         2'b11: mux_out_tmp = d0;  
         default: mux_out_tmp = d0;
       endcase
    end
    
    /*
    always @ (*)begin
      if(sel == 2'b00) mux_out_tmp = d3;
      else if(sel == 2'b01) mux_out_tmp = d2;
      else if(sel == 2'b10) mux_out_tmp = d1;
      else mux_out_tmp = d0;
    end
    */
    
    assign mux_out = mux_out_tmp;
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    四、Testbench

    module tb_mux4_1;
    
      reg [1:0] mux_out;
    
      reg [1:0] d3     ;
      reg [1:0] d2     ;
      reg [1:0] d1     ;
      reg [1:0] d0     ;
      reg [1:0] sel    ;
    
    initial begin
      d0  = 2'b11;
      d1  = 2'b00;
      d2  = 2'b01;
      d3  = 2'b10;
      case_4(sel,2'b00);
      case_4(sel,2'b01);
      case_4(sel,2'b10);
      case_4(sel,2'b11);
    
      repeat(100)begin
        case_random(sel); 
      end
    end
    
    /*-----------------------------------------------\
     --    --
    \-----------------------------------------------*/
    task case_4;
      output [1:0] a;
      input  [1:0] b;
    
      case(b)
        2'b00:    a = 2'b00;
        2'b01: #1 a = 2'b01;
        2'b10: #1 a = 2'b10;
        2'b11: #1 a = 2'b11;
      endcase
    endtask
    
    
    /*-----------------------------------------------\
     --    --
    \-----------------------------------------------*/
    task case_random;
      output [1:0] a;
      #1 a = {$random}%4;
    endtask
    
    always@(mux_out) begin              
      if(mux_out == sel  )begin
        //$display("Expected decryption result: %d", sel);
        //$display("Actual   decryption result: %d", mux_out);
        //$display("Correct! The same as the expected!\n");
      end
      else if({!mux_out[1],mux_out[0]} == sel)begin
        //$display("Expected decryption result: %d", sel);
        //$display("Actual   decryption result: %d", mux_out);
        //$display("Correct! The same as the expected!\n");
      end
      else begin
        $display("Expected decryption result: %d", sel);
        $display("Actual   decryption result: %d", mux_out);
        $display("Error!,sel= %d,out= %d\n",sel,mux_out);
      end
    end
    
    mux4_1 tb_mux4_1(
                     .d0(d0),
                     .d1(d1),
                     .d2(d2),
                     .d3(d3),
                     .sel(sel),
                     .mux_out(mux_out)
    );
    
    
    initial #100 $finish;
    initial begin
      $fsdbDumpfile("mux4_1.fsdb");
      $fsdbDumpvars            ;
      $fsdbDumpMDA             ;
    end
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    五、结果分析

    (1) TB结果

    在这里插入图片描述

    结果正常。在Testbench中写到,当预期值和结果不一致时,会出现"Error"并打印当前预期值和实际值。


    (2)波形图

    在这里插入图片描述


    (3)覆盖率

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    可以看到,总覆盖率是80.95%,并不到100%。原因在于受信号翻转覆盖率的影响,由图三可以看到,因为输入信号d0~d3始终不变,但是行覆盖率达到100%。


    ✍✍☛ 题库入口
      经过一段时间的沉淀,发现入行IC行业,自己的底子还是很差,写的文章质量参差不齐,也没能解答大家的疑问。决定还是要实打实从基础学起,由浅入深。因此决定通过补充/完善基础知识的同时,通过题库刷题不断提高自己的设计水平,题库推荐给大家(点击直达),<题库记录>栏目不定期更新,欢迎前来讨论。2022.09.05 记


    作者:xlinxdu
    版权:本文版权归作者所有
    转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

  • 相关阅读:
    rac环境rman备份
    数据预处理—滑动窗口采样数据
    npm指令运行太慢的解决方案
    数据结构之顺序表
    电商购物平台的核心业务是什么?购物车如何进行测试?
    Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】
    TouchGFX界面开发 | 项目代码结构分析
    《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》
    你知道谁是计算机之父吗?
    【torch-sparse及pytorch-geometric 安装】
  • 原文地址:https://blog.csdn.net/qq_43244515/article/details/126592283