在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3977|回复: 2

[原创] 发现Candence NC-Verilog在模拟SV的队列时的内存泄露问题

[复制链接]
发表于 2014-1-26 14:00:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 liusheng83 于 2014-1-26 14:06 编辑

发现Candence NC-Verilog(版本号:INCISIV-10.20.045-lnx86)在模拟SV的队列时的内存泄露问题

A memory leak bug of Candence NC-Verilog (INCISIV-10.20.045-lnx86) when simulating the queue of systemverilog

【注】该问题来源于工程实践。
能够观察到的行为是整个运行过程中,NC的模拟结果是正确的,但占用的内存从几百M迅速上升至大于20G,最后NC挂掉或服务器死机。本人找了三天,最终发现是NC模拟器本身内存泄露的Bug。现将抽象的、反应这一问题的原型程序贴出来,希望后来者遇到相同问题时有所启发。



module queue(/*AUTOARG*/
//Outputs
wrt_bsy, rtn_valid, rtn_data,
//Inputs
clk, rst_n, wrt_en, wrt_data, rtn_bsy));
input clk;
input rst_n;
input wrt_en;
input[63:0] wrt_data;
input rtn_bsy;
output reg wrt_bsy;
output reg rtn_valid;
output reg[63:0] rtn_data;

reg[63:0] rtn_queue[$:127];

integer length;
assign length=rtn_queue.size();

always @ (posedge clk)
   if(wrt_en) rtn_queue.push_back(wrt_data);

always @ (posedge clk or negedge rst_n)
begin
  if(!rst_n) begin
    rtn_valid<='b0;
    rtn_data<='b0;
  end
  else if((length!=0) && !rtn_bsy)
  begin
    rtn_valid<=1'b1;
    rtn_data<=rtn_queue.pop_front();
  end
  else begin
    rtn_valid<='b0;
    rtn_data<='b0;
  end
end

always @ (posedge clk or negedge rst_n)
begin
  if(!rst_n)
     wrt_bsy<=1'b0;
  else if(length<=32)
     wrt_bsy<=1'b0;
  else wrt_bsy<=1'b1;
end

endmodule

module test();
reg clk;
reg rst_n;
reg wrt_en;
reg rtn_bsy;
reg[63:0] rtn_data;
wire wrt_bsy;
wire rtn_valid;
wire[63:0] rtn_data;

initial begin
   $shm_open("queue.shm",,,,,);
   $shm_probe(queue,"AC");
end

queue queue(/*AUTOINST*/)
//Outputs
.wrt_bsy   (wrt_bsy),
.rtn_valid (rtn_valid),
.rtn_data  (rtn_data[63:0]),
//Intputs
.clk       (clk),
.rst_n     (rst_n),
.wrt_en    (wrt_en),
.wrt_data  (wrt_data[63:0]),
.rtn_bsy   (rtn_bsy));

initial begin
   clk=0;
   forever #1 clk=~clk;
end

initial begin
  #0.1
  rst_n=1;
  #2
  rst_n=0;
  #2
  rst_n=1;
end

reg[127:0] i;

initial begin
      #10
      for(i=1;i<10000000;i=i+1) begin

if(!wrt_bsy) begin

     wrt_en=$random%2;

     wrt_data={$random,$random};

end

else begin

     wrt_en='b0;

     wrt_data='b0;

end

#2;
      end
      $stop(2);
end

initial begin
        rtn_bsy=1'b1;
        #0.2
        forever #20 begin

  rtn_bsy=1'b0;

  #2
          rtn_bsy=1'b1;
        end
end

endmodule

NC在编译上述代码时没有报warning和error,但是模拟时占用的内存会越来越大,直至崩溃,该问题本质上是内存没有释放的问题,即memory leak问题。如果将上述代码中的assign length=rtn_queue.size()删除,并且所有使用length的地方替换为rtn_queue.size(),则上述问题消失。
发表于 2014-3-10 21:43:14 | 显示全部楼层
了解这个问题的原因是什么嘛?
如果把assign 写成下面:
always @(posedge clk)
begin
    length = rtn_queue.size();
end
这样还会造成内存溢出么?
 楼主| 发表于 2014-4-18 22:14:09 | 显示全部楼层
[quote]了解这个问题的原因是什么嘛?
如果把assign 写成下面:
always @(posedge clk)
begin
    length =  ...
cancerzero 发表于 2014-3-10 21:43 [/quote

终于有人回复了。感谢一下。

你说的情况我没有试过,但是直接assign时VCS是报错的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-9 00:52 , Processed in 0.020286 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表