我是靠谱客的博主 高兴花生,最近开发中收集的这篇文章主要介绍VL11 4位数值比较器电路一、题目(1)题目描述(2)端口描述二、分析三、RTL四、Testbench五、结果分析(1)TB结果(2)波形图(3)覆盖率,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

写在前面

  1. 版权:原题地址,点击直达。
  2. 这个专栏的内容记录的是Verilog题库刷题过程,附带RTLTestBench,并进行代码覆盖率收集
  3. <刷题记录>专栏,持续打卡中…

文章目录

  • 一、题目
  • (1)题目描述
  • (2)端口描述
  • 二、分析
  • 三、RTL
  • 四、Testbench
  • 五、结果分析
  • (1)TB结果
  • (2)波形图
  • (3)覆盖率


一、题目

(1)题目描述

  某4位数值比较器的功能表如下。请用Verilog语言采用门级描述方式,实现此4位数值比较器。
在这里插入图片描述


(2)端口描述

信号方向类型位宽描述
Ainputwire4bit输入的4位数据A
Binputwire4bit输入的4位数据B
Y2outputwire1bit输出信号Y2,A>B
Y1outputwire1bit输出信号Y1,A=B
Y0outputwire1bit输出信号Y0,A<B

二、分析

在这里插入图片描述

  首先得知道门级单元是什么,怎么用,如上表。


在这里插入图片描述

在这里插入图片描述

  其次得了解1位比较器的构成。写真值表,写逻辑表达式,化简、变形等。这里全部转换成与非-与非 or 或非-或非模式。


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

在这里插入图片描述

  为什么用与非-与非 or 或非-或非呢。因为在集成电路中,与非门和或非门所用资源仅次于非门。
  在CMOS电路(互补的pMOS和nMOS)实现组合逻辑门。非门(inv)消耗1个pMOS+1个nMOS;2输入与非门(nand2)和2输入或非门(nor2)均消耗2个pMOS+2个nMOS;2输入与门(and2)和2输入或门(or2)则是在nand2和nor2后面再接inv得到,需要3个pMOS和3个nMOS。
  从资源的角度来说,and和or反而不如nand和nor。与非门比或非门性能好.
  CMOS工艺中pMOS的导通能力比nMOS差,对比nand2和nor2的结构,可以发现nand2中pMOS是并联,nMOS是串联,所以性能差的单个pMOS输出“1”的能力恰好匹敌2个串联nMOS输出“0的”能力,而nor2则反过来,pMOS串联,nMOS并联,对于导通能力差的pMOS来说是雪上加霜,通常需要大幅度增加nor2中的pmos的宽度才能和nmos匹敌,但是MOS管尺寸的增加会占用更多的面积且造成更大的寄生电容。
  总之与非门,不管是几输入,都比和其对称的或非门要更优秀。但并不是说对于一个确定的组合逻辑,全部使用与非门来凑就是最优,比如说一个nor2无论如何也比用一个nand2加3个inv要好。


三、RTL

module comparator(
  input [3:0]   A ,
  input [3:0]   B ,
   
  output  wire  Y2_o , //A>B
  output  wire  Y1_o , //A=B
  output  wire  Y0_o   //A<B
);

//-- ~A and ~B
//-- not name(output,input)
not inv0(iv0_o, A[0]),
    inv1(iv1_o, A[1]),
    inv2(iv2_o, A[2]),
    inv3(iv3_o, A[3]),

    inv4(iv4_o, B[0]),
    inv5(iv5_o, B[1]),
    inv6(iv6_o, B[2]),
    inv7(iv7_o, B[3]);

//-- 
//-- nand name(output,input list)
nand nad0(nad0_o, A[0], B[0]),// ~(A0B0)
     nad1(nad1_o, A[1], B[1]),// ~(A1B1)
     nad2(nad2_o, A[2], B[2]),// ~(A2B2)
     nad3(nad3_o, A[3], B[3]),// ~(A3B3)
     nad4(nad4_o,iv0_o,iv4_o),
     nad5(nad5_o,iv1_o,iv5_o),
     nad6(nad6_o,iv2_o,iv6_o),
     nad7(nad7_o,iv3_o,iv7_o);

//-- 
nand nad00(nad00_o,nad0_o,nad4_o),
     nad11(nad11_o,nad1_o,nad5_o),
     nad22(nad22_o,nad2_o,nad6_o),
     nad33(nad33_o,nad3_o,nad7_o);

//-- 
//-- 
nor nr0(nr0_o,iv0_o,B[0]),
    nr1(nr1_o,iv1_o,B[1]),
    nr2(nr2_o,iv2_o,B[2]),
    nr3(nr3_o,iv3_o,B[3]);

//--
//-- 
//-- 
nor nr4(nr4_o,A[0],iv4_o),
    nr5(nr5_o,A[1],iv5_o),
    nr6(nr6_o,A[2],iv6_o),
    nr7(nr7_o,A[3],iv7_o);

and ad0(ad3322_o,nad33_o,nad22_o),
    ad1(ad332211_o,ad3322_o,nad11_o);

and ad_Y2_y20(ad_y20_o,ad332211_o,nr0_o),
    ad_Y2_y21(ad_y21_o,ad3322_o  ,nr1_o),
    ad_Y2_y22(ad_y22_o,nad33_o   ,nr2_o),

    ad_Y0_y00(ad_y00_o,ad332211_o,nr4_o),
    ad_Y0_y01(ad_y01_o,ad3322_o  ,nr5_o),
    ad_Y0_y02(ad_y02_o,nad33_o   ,nr6_o);



//-- output
or  (Y2_o,nr3_o,ad_y22_o,ad_y21_o,ad_y20_o),
    (Y0_o,nr7_o,ad_y02_o,ad_y01_o,ad_y00_o);

and (Y1_o,ad332211_o,nad00_o              );


endmodule

四、Testbench

`timescale 1ps/1ps

module tb_comparator;

  reg [3:0] A   ;
  reg [3:0] B   ;
  reg       Y2_o;
  reg       Y1_o;
  reg       Y0_o;

initial begin

  #5000 ;
  A = 1;
  B = 1;

  #5000 ;
  A = 1 ;
  B = 0 ;

  #5000 ;
  A = 0 ;
  B = 1 ;

  #5000 ;
  A = 0 ;
  B = 0 ;

  #5000;
  repeat(10000)begin
    d_case(A,B,{$random}%16,{$random}%16);
    #5000 ;
  end
end

/*-----------------------------------------------
 --    --
-----------------------------------------------*/
task d_case;
  output  [3:0] a;
  output  [3:0] b;

  input   [3:0] a0;
  input   [3:0] b0;


  begin
    a = a0 ;
    b = b0 ;
  end
endtask

/*-----------------------------------------------
 --  display  --
-----------------------------------------------*/

always @ ( A or B )begin
  if( A>B )begin
    if({Y2_o,Y1_o,Y0_o} == {1,0,0})begin
    end
    else begin
      $display($realtime,", A>B error:A=%d ;B=%d; Y2=%d ,Y1=%d,Y0=%d",A,B,Y2_o,Y1_o,Y0_o);
    end
  end
  else if(A==B)begin
    if({Y2_o,Y1_o,Y0_o} == {0,1,0})begin
    end
    else begin
      $display($realtime,", A=B error:A=%d ;B=%d; Y2=%d ,Y1=%d,Y0=%d",A,B,Y2_o,Y1_o,Y0_o);
    end
  end
  else if(A <B) begin
    if({Y2_o,Y1_o,Y0_o} == {0,0,1})begin
    end
    else begin
      $display($realtime,", A<B error:A=%d ;B=%d; Y2=%d ,Y1=%d,Y0=%d",A,B,Y2_o,Y1_o,Y0_o);
    end
  end
  else begin
      $display($realtime,", error:A=%d ;B=%d; Y2=%d ,Y1=%d,Y0=%d",A,B,Y2_o,Y1_o,Y0_o);
  end
end



comparator u_comparator(
                     .A  (A  ),
                     .B  (B  ),
                     .Y2_o (Y2_o ),
                     .Y1_o (Y1_o ),
                     .Y0_o (Y0_o )
                    );

initial #60000000 $finish;
initial begin
  $fsdbDumpfile("comparator.fsdb");
  $fsdbDumpvars            ;
  $fsdbDumpMDA             ;
end

endmodule

五、结果分析

(1)TB结果

在这里插入图片描述

在这里插入图片描述

display打印错误信息,显示在时钟沿变化时出现错误。猜测是因为使用了输入作敏感列表,输入到输出存在延时。


(2)波形图

在这里插入图片描述

时序符合预期,能正常比较两个4位数。


(3)覆盖率

在这里插入图片描述

代码覆盖率100%


✍✍☛ 题库入口
  经过一段时间的沉淀,发现入行IC行业,自己的底子不扎实,文章质量参差不齐,也没能解答大家的疑问。因此决定通过补充/完善基础知识的同时,通过题库刷题不断提高自己的设计水平,<题库记录>栏目不定期更新,欢迎前来讨论。


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

最后

以上就是高兴花生为你收集整理的VL11 4位数值比较器电路一、题目(1)题目描述(2)端口描述二、分析三、RTL四、Testbench五、结果分析(1)TB结果(2)波形图(3)覆盖率的全部内容,希望文章能够帮你解决VL11 4位数值比较器电路一、题目(1)题目描述(2)端口描述二、分析三、RTL四、Testbench五、结果分析(1)TB结果(2)波形图(3)覆盖率所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部