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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7186|回复: 10

[求助] 求高手解答:DC编译总是报错误--elab 366

[复制链接]
发表于 2012-6-16 14:20:35 | 显示全部楼层 |阅读模式

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

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

x
我用Memory Compiler产生的SRAM模块,用DC编译的时候总是报错,求会的指导一下。急。。。
这是我产生的SRAM代码:
`timescale 1 ns/1 ps
`celldefine
module RA1SHD256 (
   Q,
   CLK,
   CEN,
   WEN,
   A,
   D,
   OEN
);
   parameter     BITS = 16;
   parameter     word_depth = 256;
   parameter     addr_width = 8;
   parameter     wordx = {BITS{1'bx}};
   parameter     addrx = {addr_width{1'bx}};

   output [15:0] Q;
   input CLK;
   input CEN;
   input WEN;
   input [7:0] A;
   input [15:0] D;
   input OEN;
   reg [BITS-1:0]    mem [word_depth-1:0];
   reg      NOT_CEN;
   reg      NOT_WEN;
   reg      NOT_A0;
   reg      NOT_A1;
   reg      NOT_A2;
   reg      NOT_A3;
   reg      NOT_A4;
   reg      NOT_A5;
   reg      NOT_A6;
   reg      NOT_A7;
   reg [addr_width-1:0]    NOT_A;
   reg      NOT_D0;
   reg      NOT_D1;
   reg      NOT_D2;
   reg      NOT_D3;
   reg      NOT_D4;
   reg      NOT_D5;
   reg      NOT_D6;
   reg      NOT_D7;
   reg      NOT_D8;
   reg      NOT_D9;
   reg      NOT_D10;
   reg      NOT_D11;
   reg      NOT_D12;
   reg      NOT_D13;
   reg      NOT_D14;
   reg      NOT_D15;
   reg [BITS-1:0]    NOT_D;
   reg      NOT_CLK_PER;
   reg      NOT_CLK_MINH;
   reg      NOT_CLK_MINL;
   reg      LAST_NOT_CEN;
   reg      LAST_NOT_WEN;
   reg [addr_width-1:0]    LAST_NOT_A;
   reg [BITS-1:0]    LAST_NOT_D;
   reg      LAST_NOT_CLK_PER;
   reg      LAST_NOT_CLK_MINH;
   reg      LAST_NOT_CLK_MINL;

   wire [BITS-1:0]   _Q;
   wire      _OENi;
   wire [addr_width-1:0]   _A;
   wire      _CLK;
   wire      _CEN;
   wire      _OEN;
   wire                    _WEN;
   wire [BITS-1:0]   _D;
   wire                    re_flag;
   wire                    re_data_flag;

   reg      LATCHED_CEN;
   reg                   LATCHED_WEN;
   reg [addr_width-1:0]    LATCHED_A;
   reg [BITS-1:0]    LATCHED_D;
   reg      CENi;
   reg               WENi;
   reg [addr_width-1:0]    Ai;
   reg [BITS-1:0]    Di;
   reg [BITS-1:0]    Qi;
   reg [BITS-1:0]    LAST_Qi;

   reg      LAST_CLK;


   task update_notifier_buses;
   begin
      NOT_A = {
               NOT_A7,
               NOT_A6,
               NOT_A5,
               NOT_A4,
               NOT_A3,
               NOT_A2,
               NOT_A1,
               NOT_A0};
      NOT_D = {
               NOT_D15,
               NOT_D14,
               NOT_D13,
               NOT_D12,
               NOT_D11,
               NOT_D10,
               NOT_D9,
               NOT_D8,
               NOT_D7,
               NOT_D6,
               NOT_D5,
               NOT_D4,
               NOT_D3,
               NOT_D2,
               NOT_D1,
               NOT_D0};
   end
   endtask
   task mem_cycle;
   begin
      casez({WENi,CENi})
2'b10: begin
    read_mem(1,0);
end
2'b00: begin
    write_mem(Ai,Di);
    read_mem(0,0);
end
2'b?1: ;
2'b1x: begin
    read_mem(0,1);
end
2'bx0: begin
    write_mem_x(Ai);
    read_mem(0,1);
end
2'b0x,
2'bxx: begin
    write_mem_x(Ai);
    read_mem(0,1);
end
      endcase
   end
   endtask
      
   task update_last_notifiers;
   begin
      LAST_NOT_A = NOT_A;
      LAST_NOT_D = NOT_D;
      LAST_NOT_WEN = NOT_WEN;
      LAST_NOT_CEN = NOT_CEN;
      LAST_NOT_CLK_PER = NOT_CLK_PER;
      LAST_NOT_CLK_MINH = NOT_CLK_MINH;
      LAST_NOT_CLK_MINL = NOT_CLK_MINL;
   end
   endtask
   task latch_inputs;
   begin
      LATCHED_A = _A ;
      LATCHED_D = _D ;
      LATCHED_WEN = _WEN ;
      LATCHED_CEN = _CEN ;
      LAST_Qi = Qi;
   end
   endtask

   task update_logic;
   begin
      CENi = LATCHED_CEN;
      WENi = LATCHED_WEN;
      Ai = LATCHED_A;
      Di = LATCHED_D;
   end
   endtask

   task x_inputs;
      integer n;
   begin
      for (n=0; n<addr_width; n=n+1)
  begin
     LATCHED_A[n] = (NOT_A[n]!==LAST_NOT_A[n]) ? 1'bx : LATCHED_A[n] ;
  end
      for (n=0; n<BITS; n=n+1)
  begin
     LATCHED_D[n] = (NOT_D[n]!==LAST_NOT_D[n]) ? 1'bx : LATCHED_D[n] ;
  end
      LATCHED_WEN = (NOT_WEN!==LAST_NOT_WEN) ? 1'bx : LATCHED_WEN ;
      LATCHED_CEN = (NOT_CEN!==LAST_NOT_CEN) ? 1'bx : LATCHED_CEN ;
   end
   endtask
   task read_mem;
      input r_wb;
      input xflag;
   begin
      if (r_wb)
  begin
     if (valid_address(Ai))
        begin
                     Qi=mem[Ai];
        end
     else
        begin
    Qi=wordx;
        end
  end
      else
  begin
     if (xflag)
        begin
    Qi=wordx;
        end
     else
        begin
           Qi=Di;
        end
  end
   end
   endtask
   task write_mem;
      input [addr_width-1:0] a;
      input [BITS-1:0] d;

   begin
      casez({valid_address(a)})
1'b0:
  x_mem;
1'b1: mem[a]=d;
      endcase
   end
   endtask
   task write_mem_x;
      input [addr_width-1:0] a;
   begin
      casez({valid_address(a)})
1'b0:
  x_mem;
1'b1: mem[a]=wordx;
      endcase
   end
   endtask
   task x_mem;
      integer n;
   begin
      for (n=0; n<word_depth; n=n+1)
  mem[n]=wordx;
   end
   endtask
   task process_violations;
   begin
      if ((NOT_CLK_PER!==LAST_NOT_CLK_PER) ||
   (NOT_CLK_MINH!==LAST_NOT_CLK_MINH) ||
   (NOT_CLK_MINL!==LAST_NOT_CLK_MINL))
  begin
     if (CENi !== 1'b1)
               begin
    x_mem;
    read_mem(0,1);
        end
  end
      else
  begin
     update_notifier_buses;
     x_inputs;
     update_logic;
     mem_cycle;
  end
      update_last_notifiers;
   end
   endtask
   function valid_address;
      input [addr_width-1:0] a;
   begin
      valid_address = (^(a) !== 1'bx);
   end
   endfunction

   bufif0 (Q[0], _Q[0], _OENi);
   bufif0 (Q[1], _Q[1], _OENi);
   bufif0 (Q[2], _Q[2], _OENi);
   bufif0 (Q[3], _Q[3], _OENi);
   bufif0 (Q[4], _Q[4], _OENi);
   bufif0 (Q[5], _Q[5], _OENi);
   bufif0 (Q[6], _Q[6], _OENi);
   bufif0 (Q[7], _Q[7], _OENi);
   bufif0 (Q[8], _Q[8], _OENi);
   bufif0 (Q[9], _Q[9], _OENi);
   bufif0 (Q[10], _Q[10], _OENi);
   bufif0 (Q[11], _Q[11], _OENi);
   bufif0 (Q[12], _Q[12], _OENi);
   bufif0 (Q[13], _Q[13], _OENi);
   bufif0 (Q[14], _Q[14], _OENi);
   bufif0 (Q[15], _Q[15], _OENi);
   buf (_D[0], D[0]);
   buf (_D[1], D[1]);
   buf (_D[2], D[2]);
   buf (_D[3], D[3]);
   buf (_D[4], D[4]);
   buf (_D[5], D[5]);
   buf (_D[6], D[6]);
   buf (_D[7], D[7]);
   buf (_D[8], D[8]);
   buf (_D[9], D[9]);
   buf (_D[10], D[10]);
   buf (_D[11], D[11]);
   buf (_D[12], D[12]);
   buf (_D[13], D[13]);
   buf (_D[14], D[14]);
   buf (_D[15], D[15]);
   buf (_A[0], A[0]);
   buf (_A[1], A[1]);
   buf (_A[2], A[2]);
   buf (_A[3], A[3]);
   buf (_A[4], A[4]);
   buf (_A[5], A[5]);
   buf (_A[6], A[6]);
   buf (_A[7], A[7]);
   buf (_CLK, CLK);
   buf (_WEN, WEN);
   buf (_OEN, OEN);
   buf (_CEN, CEN);

   assign _OENi = _OEN;
   assign _Q = Qi;
   assign re_flag = !(_CEN);
   assign re_data_flag = !(_CEN || _WEN);

   always @(
     NOT_A0 or
     NOT_A1 or
     NOT_A2 or
     NOT_A3 or
     NOT_A4 or
     NOT_A5 or
     NOT_A6 or
     NOT_A7 or
     NOT_D0 or
     NOT_D1 or
     NOT_D2 or
     NOT_D3 or
     NOT_D4 or
     NOT_D5 or
     NOT_D6 or
     NOT_D7 or
     NOT_D8 or
     NOT_D9 or
     NOT_D10 or
     NOT_D11 or
     NOT_D12 or
     NOT_D13 or
     NOT_D14 or
     NOT_D15 or
     NOT_WEN or
     NOT_CEN or
     NOT_CLK_PER or
     NOT_CLK_MINH or
     NOT_CLK_MINL
     )
      begin
         process_violations;
      end
   always @( _CLK )
      begin
         casez({LAST_CLK,_CLK})
    2'b01: begin
       latch_inputs;
       update_logic;
       mem_cycle;
    end
    2'b10,
    2'bx?,
    2'b00,
    2'b11: ;
    2'b?x: begin
       x_mem;
              read_mem(0,1);
    end
   
  endcase
  LAST_CLK = _CLK;
      end
   specify
      $setuphold(posedge CLK, posedge CEN, 1.000, 0.500, NOT_CEN);
      $setuphold(posedge CLK, negedge CEN, 1.000, 0.500, NOT_CEN);
      $setuphold(posedge CLK &&& re_flag, posedge WEN, 1.000, 0.500, NOT_WEN);
      $setuphold(posedge CLK &&& re_flag, negedge WEN, 1.000, 0.500, NOT_WEN);
      $setuphold(posedge CLK &&& re_flag, posedge A[0], 1.000, 0.500, NOT_A0);
      $setuphold(posedge CLK &&& re_flag, negedge A[0], 1.000, 0.500, NOT_A0);
      $setuphold(posedge CLK &&& re_flag, posedge A[1], 1.000, 0.500, NOT_A1);
      $setuphold(posedge CLK &&& re_flag, negedge A[1], 1.000, 0.500, NOT_A1);
      $setuphold(posedge CLK &&& re_flag, posedge A[2], 1.000, 0.500, NOT_A2);
      $setuphold(posedge CLK &&& re_flag, negedge A[2], 1.000, 0.500, NOT_A2);
      $setuphold(posedge CLK &&& re_flag, posedge A[3], 1.000, 0.500, NOT_A3);
      $setuphold(posedge CLK &&& re_flag, negedge A[3], 1.000, 0.500, NOT_A3);
      $setuphold(posedge CLK &&& re_flag, posedge A[4], 1.000, 0.500, NOT_A4);
      $setuphold(posedge CLK &&& re_flag, negedge A[4], 1.000, 0.500, NOT_A4);
      $setuphold(posedge CLK &&& re_flag, posedge A[5], 1.000, 0.500, NOT_A5);
      $setuphold(posedge CLK &&& re_flag, negedge A[5], 1.000, 0.500, NOT_A5);
      $setuphold(posedge CLK &&& re_flag, posedge A[6], 1.000, 0.500, NOT_A6);
      $setuphold(posedge CLK &&& re_flag, negedge A[6], 1.000, 0.500, NOT_A6);
      $setuphold(posedge CLK &&& re_flag, posedge A[7], 1.000, 0.500, NOT_A7);
      $setuphold(posedge CLK &&& re_flag, negedge A[7], 1.000, 0.500, NOT_A7);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[0], 1.000, 0.500, NOT_D0);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[0], 1.000, 0.500, NOT_D0);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[1], 1.000, 0.500, NOT_D1);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[1], 1.000, 0.500, NOT_D1);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[2], 1.000, 0.500, NOT_D2);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[2], 1.000, 0.500, NOT_D2);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[3], 1.000, 0.500, NOT_D3);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[3], 1.000, 0.500, NOT_D3);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[4], 1.000, 0.500, NOT_D4);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[4], 1.000, 0.500, NOT_D4);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[5], 1.000, 0.500, NOT_D5);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[5], 1.000, 0.500, NOT_D5);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[6], 1.000, 0.500, NOT_D6);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[6], 1.000, 0.500, NOT_D6);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[7], 1.000, 0.500, NOT_D7);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[7], 1.000, 0.500, NOT_D7);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[8], 1.000, 0.500, NOT_D8);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[8], 1.000, 0.500, NOT_D8);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[9], 1.000, 0.500, NOT_D9);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[9], 1.000, 0.500, NOT_D9);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[10], 1.000, 0.500, NOT_D10);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[10], 1.000, 0.500, NOT_D10);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[11], 1.000, 0.500, NOT_D11);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[11], 1.000, 0.500, NOT_D11);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[12], 1.000, 0.500, NOT_D12);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[12], 1.000, 0.500, NOT_D12);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[13], 1.000, 0.500, NOT_D13);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[13], 1.000, 0.500, NOT_D13);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[14], 1.000, 0.500, NOT_D14);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[14], 1.000, 0.500, NOT_D14);
      $setuphold(posedge CLK &&& re_data_flag, posedge D[15], 1.000, 0.500, NOT_D15);
      $setuphold(posedge CLK &&& re_data_flag, negedge D[15], 1.000, 0.500, NOT_D15);
      $period(posedge CLK, 3.000, NOT_CLK_PER);
      $width(posedge CLK, 1.000, 0, NOT_CLK_MINH);
      $width(negedge CLK, 1.000, 0, NOT_CLK_MINL);
      (CLK => Q[0])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[1])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[2])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[3])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[4])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[5])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[6])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[7])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[8])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[9])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[10])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[11])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[12])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[13])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[14])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (CLK => Q[15])=(1.000, 1.000, 0.500, 1.000, 0.500, 1.000);
      (OEN => Q[0])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[1])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[2])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[3])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[4])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[5])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[6])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[7])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[8])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[9])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[10])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[11])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[12])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[13])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[14])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
      (OEN => Q[15])=(1.000, 1.000, 1.000, 1.000, 1.000, 1.000);
   endspecify
endmodule
`endcelldefine
总是在 always @( _CLK )
      begin
         casez({LAST_CLK,_CLK})
    2'b01: begin
       latch_inputs;
       update_logic;
       mem_cycle;
    end
    2'b10,
    2'bx?,
    2'b00,
    2'b11: ;
    2'b?x: begin
       x_mem;
              read_mem(0,1);
    end
   
  endcase
  LAST_CLK = _CLK;
      end
在casez这一行报错,错误具体说Q[i]的16个变量和mem[j]的两个变量共18个elab 366的错。
求高手指导。。。
 楼主| 发表于 2012-6-16 14:28:42 | 显示全部楼层
代码比较长,不过很简单的内容,求各位耐心看看
发表于 2012-6-16 17:35:46 | 显示全部楼层
仿真模型你拿去编译干什么...
发表于 2012-6-16 18:38:22 | 显示全部楼层
回复 3# Timme


    对,这位说的就是原因了,你拿仿真模型去综合吗?
发表于 2012-6-16 18:39:56 | 显示全部楼层
楼主你不应该拿仿真模型去综合的,MC出的SRAM,会生成相应的.db文件,做为库放入link_lib中即可了,在RTL中只要调用此SRAM的接口即可。
 楼主| 发表于 2012-6-17 04:00:55 | 显示全部楼层
回复 5# 心海的一滴泪


    第一次把MC和DC一起用,感觉DC可以编译Verilog文件就拿去编译了。
.db文件我已经产生了,也设为了link_lib的库文件。按照导师的要求,我需要看到我用MC产生的SRAM的时序,我用DC怎么才能看到产生的SRAM的时序。求详细指导一下,谢谢!
 楼主| 发表于 2012-6-17 04:03:34 | 显示全部楼层
回复 4# 心海的一滴泪


    DC不是可以综合Verilog代码吗,仿真模型也是.v格式的啊。那么怎么才能用DC看到我产生的模型的时序呢,求指导,谢谢!
 楼主| 发表于 2012-6-17 04:14:40 | 显示全部楼层
回复 5# 心海的一滴泪


     我本次的任务是将MC产生的SRAM在Candence下跑一下,最终可以得到相应的网表文件。
指导老师说的不是很清楚,我也就自己去探索了,由于Candence学的比较浅,所以自己才用DC的。
我想问一下这个用DC可以跑吗?
我是一个新手,很多地方不太懂,麻烦您了。
发表于 2012-6-17 11:00:01 | 显示全部楼层
回复 1# Kwolf


    task也能综合吗?
发表于 2014-1-19 11:25:49 | 显示全部楼层
so long
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X

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

GMT+8, 2025-6-21 00:25 , Processed in 0.028915 second(s), 11 queries , Gzip On, MemCached On.

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