Vivado DDR4, BRAM与定点数加法模块交互调试
一、实验目的
在上一实验《Vivado DDR4和BRAM交互调试经验分享 - George2024 - 博客园 (cnblogs.com)》的基础上,加入定点数加法这一功能模块,搭建一个最小的系统,实现DDR4, BRAM和功能模块的交互。相关代码已经发布在《GeorgeLin200100/FM_ADD (github.com)》,欢迎指正。
二、实验流程
分为5步(假设两个源操作数矩阵的列数均为FM_COL,行数均为FM_ROW):
- 利用随机数生成模块,生成FM_COL \(\times\) FM_ROW \(\times\) 2个定点数,并全部通过DDR UI端naive接口写入DDR。
- 从DDR读出刚刚写入的定点数,前FM_COL \(\times\) FM_ROW个数写到BRAM0中,后FM_COL \(\times\) FM_ROW个数写到BRAM1中。
- 同时从BRAM0和BRAM1中读,执行定点数加法操作,并将结果写回BRAM0,覆盖原有的数据。
- 将运算结果从BRAM0中读出,写回DDR。
- 从DDR中读出运算结果,检验正确性。
三、实验结果
- 实现了对于矩阵数据规模(FM_COL, FM_ROW) = (8, 4) / (16, 4) / (16, 8) / (64, 4) /(64, 8) /(128, 4)的有符号定点数加法(15位小数位),结果无误。
- 实现了结果的自动检查,可在tcl console中查看测试是否通过。
四、一些问题 & 体悟
问题1:Vivado有时会出现奇怪的仿真波形。如下列代码:
always @(posedge clk) begin
if (a)
b <= b + 1;
end
按照正常时序,b应该在a拉高后一周期变化。但是Vivado在多次行为级仿真中表现出a、b同时拉高。本问题在换用modelsim作为仿真工具后不再出现,在代码赋值语句中手动添加延迟后也不再出现,值得关注。Xilinx社区相关回答:[1]
问题2:real类型的比较出错。
在代码文件[E1_qadd_tb.sv]中,对于c_real和c_ref两个real类型数据,假如直接判断c_real==c_ref?,会出现判断错误。采用代码文件中如下写法,判断无误。如果判断边界±0.000001再除以\(10^6\),那么判断准确率下降到84%左右。
if (((c_real - c_ref) > -0.000001) & ((c_real - c_ref) < 0.000001)) begin
$display("Case passed");
right_num = right_num + 1;
end else begin
$display("Test failed");
err_num = err_num + 1;
end
问题3(未解决):大数据规模下出现问题。
本工程在矩阵规模\(\le 128\times4\)时运行无误,经测试,在矩阵规模\(=256\times4\)时出现一定问题(app_wdf_rdy在数据传输后期很长时间才拉高一个周期,严重影响传输效率)。此问题待排查。