问题发现
在进行 DDR3 实验时,仿真时出现以下报错信息。
ERROR: [XSIM 43-3322] Static elaboration of top level Verilog design unit(s) in library work failed.
谷歌翻译为:错误:[XSIM 43-3322]顶层Verilog设计单元在库工作中静态精化失败。
解决办法
经过仔细检查,发现出现这个报错主要可能有以下两种原因:
例化名写错
initial begin
force inst_top_ddr3_init.user_clk = user_clk; //用户控制时钟
//写指令FIFO控制模块
force inst_top_ddr3_init.fifo_wr_cmd_en = fifo_wr_cmd_en;
force inst_top_ddr3_init.fifo_wr_cmd_brust_len = fifo_wr_cmd_brust_len;
force inst_top_ddr3_init.fifo_wr_cmd_addr = fifo_wr_cmd_addr;
force inst_top_ddr3_init.fifo_wr_cmd_instr = fifo_wr_cmd_instr;
//写数据FIFO控制模块
force inst_top_ddr3_init.fifo_wr_data_en = fifo_wr_data_en;
force inst_top_ddr3_init.fifo_wr_data = fifo_wr_data;
//读指令FIFO控制模块
force inst_top_ddr3_init.fifo_rd_cmd_en = fifo_rd_cmd_en;
force inst_top_ddr3_init.fifo_rd_cmd_brust_len = fifo_rd_cmd_brust_len;
force inst_top_ddr3_init.fifo_rd_cmd_addr = fifo_rd_cmd_addr;
force inst_top_ddr3_init.fifo_rd_cmd_instr = fifo_rd_cmd_instr;
//读数据FIFO控制模块
force inst_top_ddr3_init.fifo_rd_data_en = fifo_rd_data_en;
//数据获取
force rst = inst_top_ddr3_init.inst_ddr3_arbit.rst;
force rd_end = inst_top_ddr3_init.rd_end;
force fifo_rd_data_count = inst_top_ddr3_init.fifo_rd_data_count;
force fifo_wr_cmd_full = inst_top_ddr3_init.fifo_wr_cmd_full;
force wr_end = inst_top_ddr3_init.wr_end;
end
top_ddr3_init inst_top_ddr3_init (
.ddr3_dq (ddr3_dq),
.ddr3_dqs_n (ddr3_dqs_n),
.ddr3_dqs_p (ddr3_dqs_p),
.ddr3_addr (ddr3_addr),
.ddr3_ba (ddr3_ba),
.ddr3_ras_n (ddr3_ras_n),
.ddr3_cas_n (ddr3_cas_n),
.ddr3_we_n (ddr3_we_n),
.ddr3_reset_n (ddr3_reset_n),
.ddr3_ck_p (ddr3_ck_p),
.ddr3_ck_n (ddr3_ck_n),
.ddr3_cke (ddr3_cke),
.ddr3_cs_n (ddr3_cs_n),
.ddr3_dm (ddr3_dm),
.ddr3_odt (ddr3_odt),
.sys_clk (sys_clk),
.rst_n (rst_n)
);
以上部分代码为例,在 testbench 文件中利用 force 语句对信号进行绑定时,刚开始的语句中inst_top_ddr3_init.wr_end的inst_top_ddr3_init写成了top_ddr3_init,也就是用了顶层模块的模块名,而不是用的顶层的例化名,因此就出现了以上的报错,
在顶层创建任务时,任务不存在
initial begin
#100
wr_cmd_fifo_en();
end
//创建写指令FIFO使能
// task wr_cmd_fifo_en;
// begin
// @ (negedge rst);
// @ (negedge fifo_wr_cmd_full);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// @ (posedge user_clk);
// fifo_wr_cmd_en <= 'd1;
// @ (posedge user_clk);
// fifo_wr_cmd_en <= 'd0;
// end
// endtask
比如以上情况,当在 testbench 中调用 task 任务时,但是此时task所调用的任务名不存在,或者被注释了(当时注释错了),此时进行仿真也会出现以上报错。
目前我所遇到这个报错的原因主要有这两个。