微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > DC导出的网表疑问

DC导出的网表疑问

时间:10-02 整理:3721RD 点击:
小弟的设计通过DC后,导出的网表通过vcs仿真后,波形跟前仿真有很大误差,而且基本全是X状态,但DC的综合工程中并没有时序违例也没有报任何错误,请各位大侠指点一下可能是哪儿出错了。多谢了,以下是我的前后仿真波形对比:


前仿真波形




   DC的网表仿真波形
其中:input clk,rst;
input up,down;
input [1:0]M;
output upsel,downsel;
output offset;
output [14:0]c;

这个要根据信号关系来查看引入X的原因;
最好给收入信号给初值。


应该是输入信号刚打错了

推测是vcs的library和DC的library不一致 或者时序不一致 你有试过在vcs里annotate SDF吗?

   你好,我用其他设计试过,已经确定vcs的library和DC的library是一致的,也就是说其他设计DC后的网表的仿真都跟前仿是一样的。就说明应该不是库的问题。我也试过用annotate SDF,DC的综合过程没有任何时序违例。 但针对现在出问题的这个设计,也是同样的出现上图的不定状态。请再指点下,谢谢了。我会把源程序跟测试程序都贴出来,麻烦你再帮我看看。



   你好,我用其他设计试过,已经确定vcs的library和DC的library是一致的,也就是说其他设计DC后的网表的仿真都跟前仿是一样的。就说明应该不是库的问题。我也试过用annotate SDF,DC的综合过程没有任何时序违例。 但针对现在出问题的这个设计,也是同样的出现上图的不定状态。请再指点下,谢谢了。我会把源程序跟测试程序都贴出来,麻烦你再帮我看看



   你好,我把源程序跟测试代码都贴出来吧。请麻烦你帮我看看。我 DC综合过程没有报任何时序违例, 也能确定库用的是正确的,其他设计这是这样跑流程的,都没出现过这种问题。但目前的设计就碰到这种问题,还请再指教小弟一下。两个子程序如下:
`timescale 1ns/10ps
module mux(clk,rst,upsel,downsel,M);
input clk,rst;
input upsel,downsel;
output [1:0]M;
reg [1:0]M;
parameter first=2'b00,
          second=2'b10,
          third=2'b11,
          fourth=2'b01;
always @(posedge clk or negedge rst)
  if(!rst)
    M<=first;
  else
    case(M)
      first: if(upsel==1'b1)
               M<=fourth;
             else if(downsel==1'b1)
               M<=second;
             else
               M<=first;
      second: if(upsel==1'b1)
                M<=first;
              else if(downsel==1'b1)
                M<=third;
              else
                M<=second;                 
      third: if(upsel==1'b1)
               M<=second;
             else if(downsel==1'b1)
               M<=fourth;
             else
               M<=third;           
      fourth: if(upsel==1'b1)
                M<=third;
              else if(downsel==1'b1)
                M<=first;
              else
                M<=fourth;            
    default: M<=2'bx;  
    endcase
endmodule

`timescale 1ns/10ps
module pi(clk,rst,up,down,M,upsel,downsel,offset,c);
input clk,rst;
input up,down;
input [1:0]M;
output upsel,downsel;
output offset;
output [14:0]c;
reg [14:0] c;
reg upsel,downsel,offset;
wire[1:0]M;
wire up,down;
wire clk,rst;
parameter c_0=15'b000_0000_0000_0000,
          c_1=15'b000_0000_0000_0001,
          c_2=15'b000_0000_0000_0011,
          c_3=15'b000_0000_0000_0111,
          c_4=15'b000_0000_0000_1111,
          c_5=15'b000_0000_0001_1111,
          c_6=15'b000_0000_0011_1111,
          c_7=15'b000_0000_0111_1111,
          c_8=15'b000_0000_1111_1111,
          c_9=15'b000_0001_1111_1111,
          c_10=15'b000_0011_1111_1111,
          c_11=15'b000_0111_1111_1111,
          c_12=15'b000_1111_1111_1111,
          c_13=15'b001_1111_1111_1111,
          c_14=15'b011_1111_1111_1111,
          c_15=15'b111_1111_1111_1111;
always @(posedge clk or negedge rst)
  if(!rst)
    begin
      c<=c_0;
      upsel<=0;
      downsel<=0;
    end  
  else
    case(c)
      c_0:
        begin   
          if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
            c<=c_1;
          else if((M==2'b00||M==2'b11)&&(up==0&&down==1))begin
            downsel<=1;c<=c_0;end
          else if((M==2'b10||M==2'b01)&&(up==1&&down==0))begin
            upsel<=1;c<=c_0;end
          else
                c<=c_0;              
        end
      c_1: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_2;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_0;
           else
             c<=c_1;           
      c_2: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_3;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_1;
           else
             c<=c_2;         
      c_3: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_4;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_2;
           else
             c<=c_3;        
      c_4: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_5;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_3;
           else
             c<=c_4;
      c_5: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_6;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_4;
           else
             c<=c_5;
      c_6: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_7;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_5;
           else
             c<=c_6;
      c_7: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_8;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_6;
           else
             c<=c_7;
      c_8: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_9;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_7;
           else
             c<=c_8;
      c_9: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_10;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_8;
           else
             c<=c_9;
      c_10: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_11;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_9;
           else
             c<=c_10;
      c_11: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_12;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_10;
           else
             c<=c_11;
      c_12: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_13;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_11;
           else
             c<=c_12;
      c_13: if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_14;
           else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_12;
           else
             c<=c_13;
      c_14: begin
            if(((M==2'b00||M==2'b11)&&(up==1&&down==0))||((M==2'b10||M==2'b01)&&(up==0&&down==1)))
             c<=c_15;
            else if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
             c<=c_13;
           else
             c<=c_14;
             end
      c_15: begin upsel<=0;downsel<=0;
            if(((M==2'b00||M==2'b11)&&(up==0&&down==1))||((M==2'b10||M==2'b01)&&(up==1&&down==0)))
              c<=c_14;
            else if((M==2'b00||M==2'b11)&&(up==1&&down==0))begin
              upsel<=1;c<=c_15;end
            else if((M==2'b10||M==2'b01)&&(up==0&&down==1))begin
              downsel<=1;c<=c_15;end
            else   c<=c_15;
            end
    default:c<=15'x;
    endcase
always @(posedge clk or negedge rst)
begin
if(!rst)
offset<=0;
else
  offset<=M[1]^M[0];
end
endmodule                                                                                                                             
顶层模块:
`timescale 1ns/10ps
module pimux(clk,rst,up,down,c,M,offset);
  input clk,rst;
  input up,down;
  output[1:0]M;
  output[14:0]c;
  wire up,down;
  wire clk,rst;
  wire upsel,downsel;
  output offset;
mux u1(.clk(clk),.rst(rst),.upsel(upsel),.downsel(downsel),.M(M));
  pi s1(.clk(clk),.rst(rst),.up(up),.down(down),.M(M),.upsel(upsel),.downsel(downsel),.offset(offset),.c(c));
endmodule
测试文件如下:
`timescale 1ns/10ps
module test_pimux;
initial
  begin
  $sdf_annotate ("pimux.sdf",pimux);
end
reg up,down;
reg clk,rst;
wire[1:0]M;
wire offset;
wire[14:0]c;
pimux pimux(clk,rst,up,down,c,M,offset);
always #10 clk=~clk;
initial
begin
  rst=0;
#10 rst=1;
clk=0;
  up=1;
down=0;
#400 up=0;
    down=1;
#1000;
end
endmodule

以上就是详细信息,就是简单的两个状态机相连,前仿的波形都很好,但DC的网表不管加不加延时文件都是出来的是x,请大家指点一下,谢谢!~

#10 rst = 1;
clk = 0
改为
clk = 0
#15 rst = 1;
应该就可以了。



    我试过了,果然可以了。太感谢了你, 原来不是网表的问题,是我的测试文件没写好。小弟受教了!



   解决了好,我刚上网,没来得及看



    你好,还有个小问题想请教一下。DC导出来的网表是不是可以直接拿来仿真呢?但是我的设计,如果只加DC导出的网表仿真,结果还是全X状态,但如果网表再加入DC导出的sdf文件的话,波形就是正确的。
  所以,我想请教一下,①既然DC导出的sdf文件不准确,是不是可以直接仿真网表不加延时文件就能确定功能的正确性嘛?
②像我现在这个设计,DC的网表单独仿真还是出现X状态,但在网表的基础上加入延时文件,波形就正确的。这还能说明我的设计是正确的吗?

不加SDF的话,有时GATE会使用库里的默认延迟,而用这个延迟量可能会有问题。
你可以在VCS compile时加-notimingcheck,再看仿真结果。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top