前言
通常我们需要将设计的代码和验证的代码进行分离,systemverilog中提供bind的方式,能够在不改变设计代码的前提下,在设计的代码的module或者instance下边,例化一些用于存放断言等辅助代码的module/interface/program/checker。
一、bind的语法和用法
bind支持两种语法:
语法一:
bind bind_target_instance bind_instantiation ;
#bind_target_instance ::= hierarchical_identifier constant_bit_select
hierarchical_identifier:是RTL中被绑定的层次结构,
constant_bit_select:是需要绑定的module/interface/program/checker名字;
bind_instantiation:是例化后的module/interface/program/checker名字。
示例代码如下,将cpu_sv的interface,例化取名为u_cpu_sv,并绑定到tb.dut.u_cpu的层次结构下,这个时候,在u_cpu下边就可以看到u_cpu_sv这个例化后的interface。
同时,通过tb.dut.u_cpu.u_cpu_sv.ram_loder(),可以调用interface内部的task。
interface bin_loader_if_ram#(
parameter DATAWIDTH=32,
parameter MEMDEPTH=1024,
parameter ROW_NUM=1
);
reg [DATAWIDTH-1:0] data_array[$];
task ram_loder(string ram_image = "");
if($value$plusargs("ram_image=%s", ram_image)) begin
$display("set ram_image to %s", ram_image);
end
else begin
$display("ERROR, ram_image is not specified");
$finish;
end
fd = $fopen(ram_image,"rb");
data_array.delete();
for(i = 0; (i < MEMDEPTH) && ($fread(data,fd) != 0); i = i + 1) begin
data_array.push_back(red_data);
end
$display("Read %H words into memory", data_array.size());
$fclose(fd);
end
endtask : ram_loder
...
endinterface : cpu_sv
module top
bind tb.dut.u_cpu cpu_sv u_cpu_sv();
initial begin
tb.dut.u_cpu_sv.ram_loder();
end
endmodule
语法二:
bind bind_target_scope [: bind_target_instance_list] bind_instantiation ;
#bind_target_instance_list ::= bind_target_instance { , bind_target_instance }
bind_target_scope:是模块名或者接口名;
bind_target_instance_list:存放的是需要绑定的例化名;
bind_instantiation:是例化后的module/interface/program/checker名字。
示例代码1:
bind cpu cpu_sv u_cpu_sv();
这里用的是模块名,在所有cpu模块例化后的instance下,都会去bind一个cpu_sv,例化后的名字为u_cpu_sv。
示例代码2:
bind cpu: cpu1 cpu_sv u_cpu_sv();
这里用的是例化名,cpu模块例化名为cpu1的里边会去bind一个cpu_sv,命名为u_cpu_sv。
示例代码3:
bind cpu: cpu1, cpu2, cpu3 cpu_sv u_cpu_sv();
这里用的是例化名,cpu模块例化名为cpu1/cpu2/cpu3的里边会去bind一个cpu_sv,命名为u_cpu_sv。
二、bind的好处
利用bind做的ram/rom后门初始化,可以非常方便的在sub-system/soc之间相互移植。
在移植的时候,只需要修改bind指定的路径,然后根据路径调用bind内定义的方法即可,这样实现开发的组件很大程度被复用。
总结
本文主要总结和记录一下bind的用法。