• VL2 异步复位的串联T触发器


    写在前面

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


    一、题目

    1. 题目描述

      用verilog实现两个串联的异步复位的T触发器的逻辑


    2. 状态转换

    在这里插入图片描述


    3. 信号示意图

    在这里插入图片描述


    4. 波形示意图

    在这里插入图片描述


    5. 输入描述

    输入信号类型位宽
    datawire1
    clkwire1
    rst_nwire1

    6. 输出描述

    输入信号类型位宽
    q1reg1

    二、分析

      由T触发器的特性表可以知道,当当前的输入为0时,无论输出是0还是1,输出的下一个状态均保持当前的输出值;当当前输入值是1时,输出的下一个状态是当前输出的取反。要求的时钟周期是5ns。


    三、RTL

    module Tff_2
    (
      input      clk   ,
      input      rst_n ,
      input      data  ,
    
      output reg q1
    );
    
    reg data_buf;
    
    always @ (posedge clk or negedge rst_n) begin
      if (!rst_n) begin
        data_buf <= 1'b0;
      end
      else if (data == 1) begin
        data_buf <= ~data_buf;
      end
      else begin
        data_buf <= data_buf;
      end
    end
    
    
    always @ (posedge clk or negedge rst_n) begin
      if (!rst_n) begin
        q1 <= 1'b0;
      end
      else if (data_buf == 1) begin
        q1 <= ~q1;
      end
      else begin
        q1 <= q1;
      end
    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

    四、Testbench

    `timescale 1ps/1ps
    
    module tb_Tff_2;
    
      reg  clk   ;
      reg  rst_n ;
      reg  data  ;
      
      wire q1    ;
      
    /*-----------------------------------------------\
     -- data | data_buf | next_data_buf --
     --   0  |     0    |       0       --
     --   0  |     1    |       1       --
     --   1  |     0    |       1       --
     --   1  |     1    |       0       --
    \-----------------------------------------------*/
    
    initial begin
      clk   = 1;
      rst_n = 1;
      data  = 0;
      #2500 rst_n = 0;  
      #5000 rst_n = 1;  
      repeat(5)begin
        case_4(data,1);
      end
    
      repeat(5)begin
        case_4(data,0);
      end
    
      repeat(5)begin
        case_4(data,1);
      end
      
      repeat(100)begin
        case_random(data); 
      end
    end
    
    /*-----------------------------------------------\
     --    --
    \-----------------------------------------------*/
    task case_4;
      output  a;
      input   b;
    
      case(b)
        0: #5000 a = 0;
        1: #5000 a = 1;
      endcase
    endtask
    
    task case_random;
      output  a;
      #5000 a = {$random}%2;
    endtask
    
    /*-----------------------------------------------\
     --  clock period is 5ns  --
    \-----------------------------------------------*/
    always begin
      #2500 clk = ~clk;
    end
    
    /*-----------------------------------------------\
     --  display  --
    \-----------------------------------------------*/
    always @ (posedge clk ) begin               
        $display("data = %d ; data_buf = %d ; q1 = %d",data,Tff_2.data_buf,q1);
    end
    
    Tff_2 tb_Tff_2(
                     .clk     (clk  ),
                     .rst_n   (rst_n),
                     .data    (data ),
                     .q1      (q1   )
                  );
    
    initial #350000 $finish;
    initial begin
      $fsdbDumpfile("Tff_2.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
    • 86
    • 87
    • 88
    • 89

    五、结果分析

    (1)TB分析

    在这里插入图片描述

    有TB测试结果可以看出,DUT符合“异步复位的串联T触发器”的预期功能


    (2)波形图

    在这里插入图片描述


    (3)覆盖率

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

    由覆盖率收集情况可以看到,涉及的行、信号翻转覆盖、分支覆盖率均是100%。


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


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

  • 相关阅读:
    设计模式-行为型-解释器模式
    Python列表操作指南:索引、切片、遍历与综合应用
    LeaRun模型驱动开发框架 重塑企业生产力
    nest 第三章 认识nest
    ②【Maven】从0上手Maven的安装与配置 - 最全教程 (下载 + 配置 + 环境变量 )
    leetcode做题笔记128. 最长连续序列
    “蔚来杯“2022牛客暑期多校训练营5 I题: Board Game
    玩玩群晖NAS-搭建一个私有的Git服务
    扩展-Hooks
    Android 13.0 SystemUI下拉状态栏时间格式的修改(一)
  • 原文地址:https://blog.csdn.net/qq_43244515/article/details/126802731