写在前面
- 这个专栏的内容记录的是Verilog题库刷题过程,附带RTL\TestBench,并进行
代码覆盖率收集
。- 该题库算是一个
Verilog宝藏刷题网站
了,提供在线仿真环境(题库),<刷题记录>专栏,持续打卡中…
一、题目
(1)题目描述
根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。
(2) 状态转换
条件 | 输出(c) |
---|---|
a > b | a - b |
a <= b | b - a |
其他(如出现X或者Z) | c |
(3)信号示意图
(4)端口描述
信号 | 方向 | 类型 | 位宽 | 描述 |
---|---|---|---|---|
clk | input | wire | 1bit | 时钟,时钟周期为5ns |
rst_n | input | wire | 1bit | 复位信号,异步下降沿有效 |
a[7:0] | input | wire | 8bit | 输入的无符号数据 |
b[7:0] | input | wire | 8bit | 输入的无符号数据 |
c[7:0] | output | reg | 9bit | 输出的无符号结果 |
二、分析
根据题目信息,可以使用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
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。