第三章:SystemVerilog接口和总线功能模型
上一章我们建立的Testbench缺点是缺乏模块化,所有功能都被塞进一个文件和一个SystemVerilog模块中。这使得修改、重用或调试测试台变得困难。
我们迈向UVM的第一步是使用SystemVerilog接口模块化我们的Testbench。我们将看到接口允许我们简单的共享信号,还可以使用它们来创建总线功能模型,从而将与总线相关的协议封装在简单的访问例程中。
本章主要含有以下文件:
tinyalu_pkg.sv
tinyalu_bfm.sv
tester.sv
coverage.sv
scoreboard.sv
top.sv
1、TinyALU BFM(总线功能模型)
tinyalu_bfm封装tinyalu的Testbench中的所有信号,并提供clk、reset_alu(),task和send_op()任务,用于向tinyalu发送操作。我们定义SystemVerilog接口的方式与定义模块的方式相同。我们从interface关键字开始,定义接口中的信号:
interface是sv的一个关键字,级别等同于module,一般接口使用interface进行定义。
BFM是我们迈向模块化的第一步,它处理所有信号激励的问题。
BFM提供两个task:reset_alu()和send_op()。
补充:task and function
(1)task可以添加消耗时间的语句,而function不可以消耗时间 (这一点与verilog相同)。
(2)task可以调用task和function,而function仅能调用function。
还有一点要提醒新手:task和function中是不能使用initial和always的。
interface tinyalu_bfm; //接口定义
import tinyalu_pkg::*; //文件夹导入模块
byte unsigned A;
byte unsigned B;
bit clk;
bit reset_n;
wire [2:0] op;
bit start;
wire done;
wire [15:0] result;
operation_t op_set;
//operation_t类型是包tinyalu_pkg中定义的枚举类型
//我们在界面顶部导入了tinyalu_pkg
assign op = op_set;
initial begin
clk = 0;
forever begin
#10;
clk = ~clk;
end
end
task reset_alu(); //reset_alu()task丢弃重置信号,等待两个时钟,然后再次启动。
reset_n = 1'b0;
@(negedge clk);
@(negedge clk);
reset_n = 1'b1;
start = 1'b0;
endtask : reset_alu
task send_op(input byte iA, input byte iB, input operation_t iop, output shortint alu_result); //

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



