摘要:在目前接触的项目中用到了systemverilog,研究了一下接口的使用以及如何去仿真,接口的使用非常关键,接口能够简化代码,并且方便管理。
目录
1.接口
我在碰到使用接口的时候,FPGA主要是作为slave,从软件(master)那里获取数据,所以平常使用的sudo devmem 0xA026BF00 32 0x9等等一些操作命令,都是通过软件去在某个地址输入值,然后经过串口或者网口,传到FPGA,最后对FPGA的一些寄存器进行write或者read。
使用接口,就需要定义一个纯接口的文件,但是接口文件是不能够直接使用的,它只能作为library的一员存在,所以,需要定义另外一个文件去使用接口,这样才能够起效。
比如这是一个接口文件
我们需要去使用这个接口文件,写成一个新的module。这里就可以去设置默认值,以及什么条件下,这个接口的值可以被更改。
module jb_test_regs (
input clk ,
input reset,
jb_test_ctrl_if.ctrl IFP_test_ctrl_0
//jb_test_ctrl_if.ctrl_input IFP_test_ctrl_input
);
// input and output
logic [31:0] temp_pa_indicate ;
logic [31:0] TDD_model_sel ;
assign IFP_test_ctrl_0.debug_rw[0] = TDD_model_sel;
assign IFP_test_ctrl_0.debug_rw[1] = 0;
always_ff @ (posedge clk) begin
if(reset) begin
TDD_model_sel <= 32'd0;
end
else begin
TDD_model_sel <= IFP_test_ctrl_0.test_switch[0];
end
end
endmodule
然后在顶层里面,加入这个模块,以及接口定义。
(在我的项目中这个文件又被封装成regmag_top,然后将regmap_top加入顶层)
这样,基本就完成了接口的使用。
2.接口的仿真
这边研究了一下,其实最方便的还是,直接在使用接口的时候去设定默认值就是最方便的使用,记住更改的地方,最后合工程的时候改掉即可,毕竟master是最终的软件,FPGA的一些接口只是作为slave存在。如果非要在tb文件中去对接口仿真,那么需要在顶层中加入接口
然后去掉 jb_test_ctrl_if IFP_test_ctrl();
这样就可以在写tb的时候去控制接口。但是这样子,感觉并不是很方便。
总结
大部分工程应该都有现成的接口模板,问题主要还是在仿真模块,个人感觉在最开始使用接口的module里面改值就是最方便的控制接口的办法,只需要注意还原即可。