VL7 求两个数的差值

写在前面

  1. 这个专栏的内容记录的是Verilog题库刷题过程,附带RTL\TestBench,并进行代码覆盖率收集
  2. 该题库算是一个Verilog宝藏刷题网站了,提供在线仿真环境(题库),<刷题记录>专栏,持续打卡中…


一、题目

(1)题目描述

  根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。


(2) 状态转换

条件输出(c)
a > ba - b
a <= bb - a
其他(如出现X或者Z)c

(3)信号示意图

在这里插入图片描述


(4)端口描述

信号方向类型位宽描述
clkinputwire1bit时钟,时钟周期为5ns
rst_ninputwire1bit复位信号,异步下降沿有效
a[7:0]inputwire8bit输入的无符号数据
b[7:0]inputwire8bit输入的无符号数据
c[7:0]outputreg9bit输出的无符号结果

二、分析

  根据题目信息,可以使用if - else if - else实现三个条件的输出。注意:在Testbench中,无符号数随机数产生和有符号数随机数产生的范围不一样。


三、RTL

module data_minus(
	input             clk   ,
	input             rst_n ,
	input       [7:0] a     ,
	input       [7:0] b     ,

	output  reg [7:0]c
);

always @ (posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    c <= 8'b0;
  end
  else begin 
    if (a > b) begin
      c <= a - b;
    end
    else if(a <= b) begin
      c <= b - a;
    end
    else begin
      c <= c;
    end
  end
end

endmodule

四、Testbench

`timescale 1ps/1ps
module tb_data_minus;

  reg          clk   ;
  reg          rst_n ;
  reg   [7:0]  a     ;
  reg   [7:0]  b     ;

  wire  [7:0]  c     ;
  

/*-----------------------------------------------\
 --    --
\-----------------------------------------------*/
//-- debug signal


initial begin
  clk   = 1;
  rst_n   = 1;
  #1000 rst_n = 0;
  #1551 rst_n = 1;
  #5000 a = 8'dz;b=8'd1;
  repeat(20000)begin
    #5000  d_case(a,b);
  end
end

/*-----------------------------------------------\
 --    --
\-----------------------------------------------*/
task d_case;
  output signed [7:0] a;//a
  output signed [7:0] b;//b
  
  begin
    a = {$random}%255;
    b = {$random}%255;
  end
endtask

/*-----------------------------------------------\
 --  clock period is 5ns  --
\-----------------------------------------------*/
always begin
  #2500 clk = ~clk;
end

/*-----------------------------------------------\
 --  display  --
\-----------------------------------------------*/
always @ (c)begin
  if((a > b) && (rst_n == 1))begin
    if(c == (a - b));
    else begin
      $display($realtime,",a = %d;b = %d;a-b =%d;c = %d",a,b,a-b,c);
    end
  end
  else if((a <= b) && (rst_n == 1))begin
    if(c == (b - a));
    else begin
      $display($realtime,",a = %d;b = %d;b-a =%d;c = %d",a,b,b-a,c);
    end
  end
  else begin
    if((rst_n == 0));
    else begin
      $display($realtime,",a = %d;b = %d;c = %d",a,b,c);
    end
  end
end

data_minus u_data_minus(
                 .clk          (clk   ),
                 .rst_n        (rst_n ),
                 .a            (a     ),
                 .b            (b     ),
                 .c            (c)
              );

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

五、结果分析

(1)TB结果

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

display无打印错误信息


(2)波形图

在这里插入图片描述

结合testbench监视信息和输出波形,可以确定结果与预期结果一致。


(3)覆盖率

在这里插入图片描述

代码覆盖率100%


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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xlinxdu

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值