<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5636755200589103442</id><updated>2012-02-17T01:05:49.059+08:00</updated><category term='worklife'/><category term='IC_test'/><category term='IC_verf'/><category term='IC_syn'/><category term='DSP'/><category term='IC_script'/><title type='text'>静水流深</title><subtitle type='html'>岁月像条河，流着流着就成浑汤了</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-5168666969049434167</id><published>2009-02-25T14:26:00.002+08:00</published><updated>2009-02-25T14:33:20.027+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_verf'/><title type='text'>SV interview questions</title><content type='html'>&lt;strong&gt;enjoy it！！:)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Qi1)What is callback ?&lt;br /&gt;&lt;br /&gt;(Qi2)What is factory pattern ?&lt;br /&gt;&lt;br /&gt;(Qi3)Explain the difference between data types logic and reg and wire .&lt;br /&gt;&lt;br /&gt;(Qi4)What is the need of clocking blocks ?&lt;br /&gt;&lt;br /&gt;(Qi5)What are the ways to avoid race condition between testbench and RTL using SystemVerilog?&lt;br /&gt;&lt;br /&gt;(Qi6)Explain Event regions in SV.&lt;br /&gt;&lt;br /&gt;(Qi7)What are the types of coverages available in SV ?&lt;br /&gt;&lt;br /&gt;(Qi8)What is OOPS?&lt;br /&gt;&lt;br /&gt;(Qi9)What is inheritance and polymorphism?&lt;br /&gt;&lt;br /&gt;(Qi10)What is the need of virtual interfaces ?&lt;br /&gt;&lt;br /&gt;(Qi11)Explain about the virtual task and methods .&lt;br /&gt;&lt;br /&gt;(Qi12)What is the use of the abstract class?&lt;br /&gt;&lt;br /&gt;(Qi13)What is the difference between mailbox and queue?&lt;br /&gt;&lt;br /&gt;(Qi14)What data structure you used to build scoreboard?&lt;br /&gt;&lt;br /&gt;(Qi15)What are the advantages of linkedlist over the queue ?&lt;br /&gt;&lt;br /&gt;(Qi16)How parallel case and full cases problems are avoided in SV ?&lt;br /&gt;&lt;br /&gt;(Qi17)What is the difference between pure function and cordinary function ?&lt;br /&gt;&lt;br /&gt;(Qi18)What is the difference between $random and $urandom?&lt;br /&gt;&lt;br /&gt;(Qi19)What is scope randomization ?&lt;br /&gt;&lt;br /&gt;(Qi20)List the predefined randomization methods.&lt;br /&gt;&lt;br /&gt;(Qi21)What is the dfference between always_combo and always@(*)c?&lt;br /&gt;&lt;br /&gt;(Qi22)What is the use of packagess?&lt;br /&gt;&lt;br /&gt;(Qi23)What is the use of $cast?&lt;br /&gt;&lt;br /&gt;(Qi24)How to call the task which is defined in parent object into derived class ?&lt;br /&gt;&lt;br /&gt;(Qi25)What is the difference between rand and randc?&lt;br /&gt;&lt;br /&gt;(Qi26)What is $root?&lt;br /&gt;&lt;br /&gt;(Qi27)What is $unit?&lt;br /&gt;&lt;br /&gt;(Qi28)What are bi-directional constraints?&lt;br /&gt;&lt;br /&gt;(Qi29)What is solve...before constraint ?&lt;br /&gt;&lt;br /&gt;(Qi30)Without using randomize method or rand,generate an array of unique values?&lt;br /&gt;&lt;br /&gt;(Qi31)Explain about pass by ref and pass by value?&lt;br /&gt;&lt;br /&gt;(Qi32)What is the difference between&lt;br /&gt;bit[7:0] sig_1;&lt;br /&gt;byte sig_2;&lt;br /&gt;&lt;br /&gt;(Qi33)What is the difference between program block and module ?&lt;br /&gt;&lt;br /&gt;(Qi34)What is final block ?&lt;br /&gt;&lt;br /&gt;(Qi35)How to implement always block logic in program block ?&lt;br /&gt;&lt;br /&gt;(Qi36)What is the difference between fork/joins, fork/join_none fork/join_any ?&lt;br /&gt;&lt;br /&gt;(Qi37)What is the use of modports ?&lt;br /&gt;&lt;br /&gt;(Qi38)Write a clock generator without using always block.&lt;br /&gt;&lt;br /&gt;(Qi39)What is forward referencing and how to avoid this problem?&lt;br /&gt;&lt;br /&gt;(Qi40)What is circular dependency and how to avoid this problem ?&lt;br /&gt;&lt;br /&gt;(Qi41)What is cross coverage ?&lt;br /&gt;&lt;br /&gt;(Qi42)Describe the difference between Code Coverage and Functional Coverage Which is more important and Why we need them&lt;br /&gt;&lt;br /&gt;(Qi43)How to kill a process in fork/join?&lt;br /&gt;&lt;br /&gt;(Qi44)Difference between Associative array and Dynamic array ?&lt;br /&gt;&lt;br /&gt;(Qi45)Difference b/wProcedural and Concarent Assertions?&lt;br /&gt;&lt;br /&gt;(Qi46)What are the advantages of SystemVerilog DPI?&lt;br /&gt;&lt;br /&gt;(Qi47)how to randomize dynamic arrays of objects?&lt;br /&gt;&lt;br /&gt;(Qi48)What is randsequence and what is its use?&lt;br /&gt;&lt;br /&gt;(Qi49)What is bin?&lt;br /&gt;&lt;br /&gt;(Qi50)&lt;br /&gt;Initial&lt;br /&gt;wait_order(a,b,c);&lt;br /&gt;&lt;br /&gt;Which from below initial process will cause that above wait order will pass.&lt;br /&gt;a)&lt;br /&gt;ig initial begin&lt;br /&gt;#1;&lt;br /&gt;-&gt;a;&lt;br /&gt;-&gt;b;&lt;br /&gt;-&gt;c;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;b)&lt;br /&gt;initial begin&lt;br /&gt;#1;&lt;br /&gt;-&gt;a;&lt;br /&gt;end&lt;br /&gt;always @a-&gt;b;&lt;br /&gt;always(at)b-&gt; c;&lt;br /&gt;&lt;br /&gt;c)&lt;br /&gt;&lt;br /&gt;initial begin&lt;br /&gt;#1;&lt;br /&gt;-&gt;a;&lt;br /&gt;#0 -&gt;b;&lt;br /&gt;-&gt;&gt;c;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;d)&lt;br /&gt;&lt;br /&gt;initial begin&lt;br /&gt;#1 -&gt;a;&lt;br /&gt;#1 -&gt;b;&lt;br /&gt;#1 -&gt;c;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Qi51)Why always block is not allowed in program block?&lt;br /&gt;&lt;br /&gt;(Qi52)Which is best to use to model transaction? Struct or class ?&lt;br /&gt;&lt;br /&gt;(Qi53)How SV is more random stable then Verilog?&lt;br /&gt;&lt;br /&gt;(Qi54)Difference between assert and expect statements?&lt;br /&gt;&lt;br /&gt;(Qi55)How to add a new processs with out disturbing the random number generator state ?&lt;br /&gt;&lt;br /&gt;(Qi56)What is the need of alias in SV?&lt;br /&gt;&lt;br /&gt;(Qi57)What would be the output of the following code and how to avoid it?&lt;br /&gt;for(int i=0; i&lt;n;i++)begin class="" i="0;" j="i;"&gt; 1?&lt;br /&gt;Ans:=&gt;&lt;br /&gt;&lt;br /&gt;(Qi62)What is the need to implement explicitly a copy() method inside a transaction , when we can simple assign one object to other ?&lt;br /&gt;&lt;br /&gt;(Qi63)How different is the implementation of a struct can union in SV.&lt;br /&gt;&lt;br /&gt;(Qi64)What is "this"?&lt;br /&gt;&lt;br /&gt;(Qi65)What is tagged union ?&lt;br /&gt;&lt;br /&gt;(Qi66)What is "scope resolution operator"?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Qi67)What is the difference between Verilog Parameterized Macros and SystemVerilog Parameterized Macros?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Qi68)What is the difference between&lt;br /&gt;logic data_1;&lt;br /&gt;var logic data_2;&lt;br /&gt;wire logic data_3j;&lt;br /&gt;bit data_4;&lt;br /&gt;var bit data_5;&lt;br /&gt;&lt;br /&gt;(Qi69)What is the difference between bits and logic?&lt;br /&gt;&lt;br /&gt;(Qi70)Write a Statemechine in SV styles.&lt;br /&gt;&lt;br /&gt;(Qi71)What is the difference between $rose and posedgec?&lt;br /&gt;&lt;br /&gt;(Qi72)What is advantage of program block over clockcblock w.r.t race condition?&lt;br /&gt;&lt;br /&gt;(Qi73)How to avoid the race condition between programblock ?&lt;br /&gt;&lt;br /&gt;(Qi74)What is the difference between assumes and assert?&lt;br /&gt;&lt;br /&gt;(Qi75)What is coverage driven verification?&lt;br /&gt;&lt;br /&gt;(Qi76)What is layered architecture ?&lt;br /&gt;&lt;br /&gt;(Qi77)What are the simulation phases in your verification environment?&lt;br /&gt;&lt;br /&gt;(Qi78)How to pick a element which is in queue from random index?&lt;br /&gt;&lt;br /&gt;(Qi79)What data structure is used to store data in your environment and why ?&lt;br /&gt;&lt;br /&gt;(Qi80)What is casting? Explain about the various types of casting available in SV.&lt;br /&gt;&lt;br /&gt;(Qi81)How to importuall the items declared inside a package ?&lt;br /&gt;&lt;br /&gt;(Qi82)Explain how the timescale unit and precision are taken when a module does not have any timescalerdeclaration in RTL?&lt;br /&gt;&lt;br /&gt;(Qi83)What is streaming operator and what is its use?&lt;br /&gt;&lt;br /&gt;(Qi84)What are void functions ?&lt;br /&gt;&lt;br /&gt;(Qi85)How to make sure that a function argument passed has ref is not changed by the function?&lt;br /&gt;&lt;br /&gt;(Qi86)What is the use of "extern"?&lt;br /&gt;&lt;br /&gt;(Qi87)What is the difference between initial block and final block?&lt;br /&gt;Ans:&lt;br /&gt;&lt;br /&gt;You can't schedule an event or have delays in final block.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(Qi88)How to check weather a handles is holding object or not ?&lt;br /&gt;&lt;br /&gt;(Qi89)How to disable multiple threads which are spawned by fork...join&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-5168666969049434167?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/5168666969049434167/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=5168666969049434167' title='38 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/5168666969049434167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/5168666969049434167'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2009/02/sv-interview-questions.html' title='SV interview questions'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-3240523663198477284</id><published>2009-02-24T21:08:00.002+08:00</published><updated>2009-02-24T21:49:51.503+08:00</updated><title type='text'>SV中join_any和join_none的使用情景</title><content type='html'>join_any是指父进程进入等待状态，直到有一个子进程完成。一旦有一个子进程完成，那么父进程也就继续往下进行，但是其他的子线程依然在队列中，并不会消失，因此，fork-join_any后面通常会有一条杀掉其他子进程的语句（disable fork)。由于join_any的这种特性，因此经常用于看门狗的设计。如下面语句：&lt;br /&gt;fork: frameo_wd_timer&lt;br /&gt;     @(negedge router.cb.frameo_n[da]);&lt;br /&gt;     begin&lt;br /&gt;       repeat(1000) @(router.cb);&lt;br /&gt;       $display("\n%m\n[ERROR]%t Frame signal timed out!\n", $realtime);&lt;br /&gt;       $finish;&lt;br /&gt;     end&lt;br /&gt;join_any: frameo_wd_timer&lt;br /&gt;disable frameo_wd_timer;&lt;br /&gt;&lt;br /&gt;join_none是指父进程根本不等自进程，继续往下执行，此时的子进程在队列中排队等待，直到父进程遇到阻塞性的语句,即wait,#,@。不包括阻塞性的赋值语句（a = 1'b1)。如下面的语句：&lt;br /&gt;program automatic test;&lt;br /&gt;reg a;&lt;br /&gt;initial&lt;br /&gt; begin&lt;br /&gt;   fork&lt;br /&gt;  begin&lt;br /&gt;  #2;&lt;br /&gt;  $display("%t:state1",$time);&lt;br /&gt;  &lt;br /&gt;  end&lt;br /&gt;  begin&lt;br /&gt;  $display("%t:state2",$time);&lt;br /&gt;  #2;&lt;br /&gt;  end&lt;br /&gt;   join_none&lt;br /&gt;   $display("%t:state3",$time);&lt;br /&gt;   $display("%t:state4",$time);&lt;br /&gt;   a =1'b1;&lt;br /&gt;   $display("%t:state4.1",$time);&lt;br /&gt;   fork&lt;br /&gt;  begin&lt;br /&gt;  $display("%t:state5",$time);&lt;br /&gt;  #2;&lt;br /&gt;  end&lt;br /&gt;  begin&lt;br /&gt;  $display("%t:state6",$time);&lt;br /&gt;  #2;&lt;br /&gt;  end&lt;br /&gt;   join_none&lt;br /&gt;   $display("%t:state7",$time);&lt;br /&gt;   wait fork;&lt;br /&gt; end&lt;br /&gt;endprogram&lt;br /&gt;在VCS中执行结果为；&lt;br /&gt;                  0:state3&lt;br /&gt;                  0:state4&lt;br /&gt;                  0:state4.1&lt;br /&gt;                  0,state7&lt;br /&gt;                  0:state2&lt;br /&gt;                  0:state5&lt;br /&gt;                  0:state6&lt;br /&gt;                  2:state1&lt;br /&gt;由于fork-join_none的不阻塞特性，经常用于monitor进程观测对象，也用于产生很多独立的激励进程。如下面的语句：&lt;br /&gt;task Generator::start();&lt;br /&gt; if (TRACE_ON) $display("[TRACE]%t %s:%m", $realtime, name);&lt;br /&gt; fork&lt;br /&gt;   for (int i=0; i&lt;run_for_n_packets run_for_n_packets=""&gt;&lt;= 0; i++) begin&lt;br /&gt;     gen();&lt;br /&gt;     begin&lt;br /&gt;       Packet pkt = new pkt2send;&lt;br /&gt;       out_box[pkt.sa].put(pkt);&lt;br /&gt;     end&lt;br /&gt;   end&lt;br /&gt; join_none&lt;br /&gt;endtask&lt;br /&gt;&lt;/run_for_n_packets&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-3240523663198477284?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/3240523663198477284/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=3240523663198477284' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3240523663198477284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3240523663198477284'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2009/02/svjoinanyjoinnone.html' title='SV中join_any和join_none的使用情景'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-7346501883263623975</id><published>2009-02-24T17:09:00.005+08:00</published><updated>2009-02-24T20:03:22.054+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_verf'/><title type='text'>SV中mailbox的使用</title><content type='html'>下面为学习mailbox写的一个简单的sv代码，主要功能是一方发送随机数量的packet，一方接收该packet，两者的channel使用mailbox来实现。在questasim 6.5版本上编译通过，仿真通不过，具体的原因是questasim对mailbox的内容要求为packed类型。在VCS 200812版本上编译通过，仿真通过。&lt;br /&gt;program automatic test_mailbox;&lt;br /&gt;  timeunit 1ns;&lt;br /&gt;  timeprecision 1ps;&lt;br /&gt;  int run_for_n_pkt = 10;&lt;br /&gt;  &lt;br /&gt;  class packet;&lt;br /&gt;    rand bit [3:0] addr;&lt;br /&gt;    rand bit [7:0]  din;&lt;br /&gt;    rand reg [7:0]  payload[];&lt;br /&gt;    &lt;br /&gt;    function new();  &lt;br /&gt;    endfunction&lt;br /&gt;  &lt;br /&gt;    constraint pkt_ct {&lt;br /&gt;      addr dist {[0:3] :=40,[4:7] :=60};&lt;br /&gt;      din  inside {[0:$]};&lt;br /&gt;      payload.size() inside {[2:4]};&lt;br /&gt;      foreach(payload[i])&lt;br /&gt;        payload[i] == i;&lt;br /&gt;      }&lt;br /&gt;  endclass&lt;br /&gt;        &lt;br /&gt;  class tx_pkts;&lt;br /&gt;    string name;&lt;br /&gt;    int   num_pkt;&lt;br /&gt;    packet tx_pkt;&lt;br /&gt;    mailbox tx_mbx;&lt;br /&gt;    &lt;br /&gt;    function new(string name = "TXP" ,mailbox tx_mbx = null,int num_pkt);&lt;br /&gt;      this.name = name;&lt;br /&gt;      this.tx_mbx = tx_mbx;  &lt;br /&gt;      if(num_pkt &lt;= 0 )&lt;br /&gt;        this.num_pkt = 1;&lt;br /&gt;      else    &lt;br /&gt;        this.num_pkt = num_pkt;&lt;br /&gt;    endfunction&lt;br /&gt;    &lt;br /&gt;    function void display();&lt;br /&gt;      $display("tx_pkt name is %s",name);&lt;br /&gt;    endfunction&lt;br /&gt;      &lt;br /&gt;    task send_pkts();&lt;br /&gt;      fork &lt;br /&gt;        for(int i=0 ; i&lt; num_pkt ;i++)&lt;br /&gt;          begin&lt;br /&gt;              packet temp_pkt;&lt;br /&gt;              temp_pkt = new();&lt;br /&gt;              if(!(temp_pkt.randomize()))&lt;br /&gt;                begin&lt;br /&gt;                    $display("%t : randomize failed,please check your svtb! :%m",$realtime);&lt;br /&gt;                    $finish;&lt;br /&gt;                end&lt;br /&gt;               tx_mbx.put(temp_pkt);&lt;br /&gt;              $display("transmitting data at %t:\n",$realtime);&lt;br /&gt;              $display("addr = %4b ; din = %8b;",temp_pkt.addr,temp_pkt.din);&lt;br /&gt;              foreach(temp_pkt.payload[j])&lt;br /&gt;                $display("payload[%d] = %2h;",j,temp_pkt.payload[j]);   &lt;br /&gt;              #3;&lt;br /&gt;          end              &lt;br /&gt;        join_none &lt;br /&gt;      endtask &lt;br /&gt;    endclass&lt;br /&gt;    &lt;br /&gt;    class rx_pkts;&lt;br /&gt;      event done;&lt;br /&gt;      string name;&lt;br /&gt;      int num_pkt;&lt;br /&gt;      packet rx_pkt;&lt;br /&gt;      mailbox rx_mbx;&lt;br /&gt;    &lt;br /&gt;      function new(string name = "RXP",mailbox rx_mbx = null);&lt;br /&gt;        this.name = name;&lt;br /&gt;        this.rx_mbx = rx_mbx;&lt;br /&gt;        this.num_pkt = 0;&lt;br /&gt;      endfunction&lt;br /&gt;  &lt;br /&gt;      task receive_pkts();&lt;br /&gt;        fork &lt;br /&gt;          while(1)&lt;br /&gt;            begin&lt;br /&gt;              packet temp_pkt;&lt;br /&gt;              rx_mbx.get(temp_pkt);&lt;br /&gt;              $display("receiving data at %t:\n",$realtime);&lt;br /&gt;              $display("addr = %4b ; din = %8b;",temp_pkt.addr,temp_pkt.din);&lt;br /&gt;              foreach(temp_pkt.payload[j])&lt;br /&gt;                $display("payload[%d] = %2h;",j,temp_pkt.payload[j]);                &lt;br /&gt;              num_pkt++;&lt;br /&gt;              if(num_pkt &gt;= run_for_n_pkt)&lt;br /&gt;                -&gt;done;&lt;br /&gt;            end&lt;br /&gt;        join_none&lt;br /&gt;      endtask&lt;br /&gt;    endclass&lt;br /&gt;    &lt;br /&gt;    initial&lt;br /&gt;      begin&lt;br /&gt;        mailbox p_mbx;&lt;br /&gt;        tx_pkts txp;&lt;br /&gt;        rx_pkts rxp;&lt;br /&gt;        p_mbx = new();&lt;br /&gt;        txp = new("INTEL",p_mbx,run_for_n_pkt);&lt;br /&gt;        rxp = new("VIMICRO",p_mbx);&lt;br /&gt;        #10;&lt;br /&gt;        txp.send_pkts();&lt;br /&gt;        rxp.receive_pkts();&lt;br /&gt;        wait(rxp.done.triggered);&lt;br /&gt;      end&lt;br /&gt;      &lt;br /&gt;  endprogram&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-7346501883263623975?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/7346501883263623975/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=7346501883263623975' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7346501883263623975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7346501883263623975'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2009/02/systemverilogmailbox.html' title='SV中mailbox的使用'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-3919354145810605276</id><published>2009-02-13T08:52:00.006+08:00</published><updated>2009-02-13T10:13:03.100+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSP'/><title type='text'>语音信号处理中几个电平的含义</title><content type='html'>1.绝对功率电平&lt;br /&gt;&lt;br /&gt;通常是以1mw为基准功率，相对与1mw的功率电平称之为绝对功率电平，其电平符号为dBm，比如20W的功率输入，就可以认为输入电平是10*log（20W/1mW) ,即43dBm。0dBm表示1mw的输入电平，这一毫瓦基准值是在600欧姆（Ω）的电阻上耗散的一毫瓦功率，此时电阻上的电压有效值为0.775伏(V)，所流过的电流为1.291毫安（mA）。取作基准值的1mW，0.775V，1.291mA分别称为零电平功率，零电平电压和零电平电流。 注意一下就是dB不要写成DB，db等等其他形式，这个已经成为ITU的规范。&lt;br /&gt;&lt;br /&gt;2.相对功率电平&lt;br /&gt;不使用固定的功率作为比较的基准，而是以参考点的信号功率为比较对象，这样求得的电平称为相对功率电平，其电平符号为dBr。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;3.TLP&lt;/p&gt;&lt;p&gt;全称为transmission level point，即传送电平点，这是为了简化电路设计引入的一个概念，比如一个点，定义为0TLP，经过3db的衰减后到了另一个点，那么这个点的TLP值就为-3TLP。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4.dBm0&lt;/p&gt;dBm0的含义同dBm类似，只是相对于零TLP点的dBm值。还是很难理解是把，看下面的图就明白了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5302092603559041474" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 115px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_8ua4DbBBDsg/SZTRIZlc2cI/AAAAAAAAAEM/Xx4Wrto6BZY/s400/dbm.bmp" border="0" /&gt;所以一个参考点的dBm0值的计算方法如下：Value(dBm0) = Value(dBm) - Value(TLP)；所以在一个电路中不管经过怎么样的衰减还是放大，各个点的dBm0都是一样的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-3919354145810605276?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/3919354145810605276/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=3919354145810605276' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3919354145810605276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3919354145810605276'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2009/02/blog-post.html' title='语音信号处理中几个电平的含义'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8ua4DbBBDsg/SZTRIZlc2cI/AAAAAAAAAEM/Xx4Wrto6BZY/s72-c/dbm.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-2328383882896472413</id><published>2008-12-30T19:32:00.001+08:00</published><updated>2008-12-30T20:13:35.264+08:00</updated><title type='text'>VCS2008在ubuntu上的安装</title><content type='html'>今天不上班，在家休息之余，装了个VCS2008，跑跑小仿真玩玩。在公司里仿真器都是采用cadence的ldv5.1，版本比较老，对systemverilog的支持比较弱，加上目前还找不到ius的仿真器，于是还是搞俺的VCS吧。&lt;br /&gt;&lt;br /&gt;ubuntu版本：8.04&lt;br /&gt;VCS版本：2008.12&lt;br /&gt;&lt;br /&gt;安装过程采用synopsys推荐的标准安装方法，采用synopsys installer V1.8安装tar文件，然后就是设置环境变量，由于之前安装DC的时候license生成，并且指定好，所以这一步可以简化，只需要指定VCS_HOME环境变量。最后就是指定路径哈，比较简单。这些做完之后，试了一下在console中敲入vcs tb.v，结果通常会让人感到郁闷。&lt;br /&gt;1.首先是一个linux内核的warning,实际上不影响最后的功能，为了每次不报告出warning，还是设置了一下环境变量:setenv VCS_ARCH_OVERRIDE linux&lt;br /&gt;2.编译的时候stdio.h的文件找不到。查看了一下/usr/include内容，确实是没有该头文件，&lt;span style="font-family:monospace;"&gt;安装下面文件即可&lt;/span&gt; sudo apt-get install build-essential&lt;br /&gt;3.在链接文件的时候，提示lz错误，应该是缺少libz.a或者是libz.so文件，从网上download一个zlib的文件，tar解压后，使用./configuire来配置，并且make安装。安装完毕后可以在/usr/local/lib里发现多了一个libz.a文件，正是所需要的。&lt;br /&gt;&lt;br /&gt;一切完毕之后编译链接都过了，产生一个simv文件，然后调用simv -gui，ok～，一切搞定，目前还没有发现其他的问题。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8ua4DbBBDsg/SVoPdIi9WAI/AAAAAAAAAD0/JpXtVVJQeN8/s1600-h/Screenshot-DVE+-+TopLevel.1+-+%5BSource.1+-+tb:+tb.v%5D.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 271px;" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SVoPdIi9WAI/AAAAAAAAAD0/JpXtVVJQeN8/s400/Screenshot-DVE+-+TopLevel.1+-+%5BSource.1+-+tb:+tb.v%5D.png" alt="" id="BLOGGER_PHOTO_ID_5285554105857431554" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_8ua4DbBBDsg/SVoQTjjTNoI/AAAAAAAAAEE/5I0qzbAHuLM/s1600-h/Screenshot-DVE+-+TopLevel.2+-+%5BWave.1%5D.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 271px;" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SVoQTjjTNoI/AAAAAAAAAEE/5I0qzbAHuLM/s400/Screenshot-DVE+-+TopLevel.2+-+%5BWave.1%5D.png" alt="" id="BLOGGER_PHOTO_ID_5285555040819558018" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-2328383882896472413?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/2328383882896472413/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=2328383882896472413' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2328383882896472413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2328383882896472413'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/vcs2008ubuntu.html' title='VCS2008在ubuntu上的安装'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8ua4DbBBDsg/SVoPdIi9WAI/AAAAAAAAAD0/JpXtVVJQeN8/s72-c/Screenshot-DVE+-+TopLevel.1+-+%5BSource.1+-+tb:+tb.v%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-9044365553783408117</id><published>2008-12-26T16:38:00.003+08:00</published><updated>2008-12-26T17:27:50.107+08:00</updated><title type='text'>set_ideal_network 和set_dont_touch_network的使用总结</title><content type='html'>&lt;p&gt;set_ideal_network用来对port，pin，net来设置ideal_network属性，所谓的ideal_network属性就是0电阻0电容+所有的cell和net都dont_touch。因此就会0转换时间，0延时，综合优化的时候不会对路径的cell和net进行优化。&lt;/p&gt;&lt;p&gt;注意：1.对net进行设置的时候，必须要带上no_propagate的属性，否则是加不上去的。对port和pin可以加上带也可以不带no_propagate。2.当ideal_network经过一个组合logic的时候，只有当所有的输入都具有ideal属性，并且至少有一半具有传播的属性，即不带-no_propagate，输出端才有ideal_net属性。3.在定义时钟的时候，默认是具有这个属性的，但是要注意的是，当时钟网络上具有多输入组合逻辑的时候，时钟的ideal_net属性是不会穿过这个组合逻辑的。比如一个2in1 mux，输出端就不具备ideal_net属性，延时就会计算进去。所以定义时钟的时候最好还是加上这条命令。&lt;/p&gt;&lt;p&gt;set_dont_touch_network用来对port，pin，clock来设置dont_touch_network的属性。所谓的dont_touch_network属性就是在优化的时候，不会对原有的器件进行替换。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-9044365553783408117?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/9044365553783408117/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=9044365553783408117' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9044365553783408117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9044365553783408117'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/setidealnetwork-setdonttouchnetwork.html' title='set_ideal_network 和set_dont_touch_network的使用总结'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-1499735481812397676</id><published>2008-12-25T15:18:00.009+08:00</published><updated>2008-12-25T17:02:13.709+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_script'/><title type='text'>tcl在DC中的使用-----part2</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/SVNDt7iXUFI/AAAAAAAAADM/Pwl4tEReGoQ/s1600-h/æœªå‘½å.JPG"&gt;&lt;/a&gt;1.如何查询当前design的registers占leaf cell的比重呢？&lt;br /&gt;&lt;div&gt;registers数目可以用all_registers来得到，下面为tcl脚本：&lt;/div&gt;&lt;div&gt;set leafcells [get_cells *] &lt;/div&gt;&lt;div&gt;set flops [all_registers]&lt;/div&gt;&lt;div&gt;set cnt_leaf [size_of_collection $leafcells]&lt;/div&gt;&lt;div&gt;set cnt_flops [size_of_collection $flops]&lt;/div&gt;&lt;div&gt;set precentage [expr 100.0 * $cnt_flops / $cnt_leaf]&lt;/div&gt;&lt;div&gt;unset flops&lt;/div&gt;&lt;br /&gt;&lt;div&gt;实际上all_registers可以用另一种方法得到：&lt;/div&gt;&lt;div&gt;get_cells * -filter "is_sequential == true"，在filter中常用的操作符有 == =~ !~ defined() undefined()。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;2 timing path的深入操作&lt;img id="BLOGGER_PHOTO_ID_5283631623984673570" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 345px; CURSOR: hand; HEIGHT: 155px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_8ua4DbBBDsg/SVM699egcyI/AAAAAAAAAC8/R2uShl9faKs/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;上面标出了timing path最常用的七个属性，注意不能用get_object_name来对某条timing path在操作，因为timing path没有name的属性。只有具有name属性的单个对象的集合才可以使用get_object_name或者get_attribute XXX full_name。所以get_timing_paths要结合get_attribute使用。另外需要注意的是使用get_attribute得到的属性也有可能是一个集合，糊涂了是把。看看下面的例子：&lt;img id="BLOGGER_PHOTO_ID_5283642792632246546" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 412px; CURSOR: hand; HEIGHT: 106px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_8ua4DbBBDsg/SVNFID7l4RI/AAAAAAAAADk/ZHphtHSxXIc/s400/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;br /&gt;get_timing_paths有很多的option，基本上和report_timing的option是一样的。因此用起来很方便。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-1499735481812397676?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/1499735481812397676/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=1499735481812397676' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1499735481812397676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1499735481812397676'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/tcldc-part2.html' title='tcl在DC中的使用-----part2'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8ua4DbBBDsg/SVM699egcyI/AAAAAAAAAC8/R2uShl9faKs/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-64056776246853555</id><published>2008-12-25T09:45:00.005+08:00</published><updated>2008-12-25T15:18:00.293+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_script'/><title type='text'>tcl在DC中的使用-----part1</title><content type='html'>1.计算target library中mux单元的个数（mux单元都是mx开头的形式）&lt;br /&gt;&lt;br /&gt;proc mux_cnt{{lib_name typical.db}} {&lt;br /&gt;redirect -variable libdata {report_lib $lib_name}&lt;br /&gt;set mx_number [regexp -all mx $libdata]&lt;br /&gt;echo "the count of mux in $lib_name is \t $mx_number\n"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;说明：&lt;br /&gt;redirect不仅可以将命令的输出送到文件中，也可以送到某个变量中，如果送到文件中，也可以用unix下glob -c mx $file来计算mx_number。&lt;br /&gt;regexp不仅可以返回是否匹配的标志，也可以使用-all来返回匹配的个数。&lt;br /&gt;&lt;br /&gt;2.计算一个timing group中TNS&lt;br /&gt;&lt;br /&gt;proc rpt_TNV {} {&lt;br /&gt;redirect -variable rptstring {report_constraint -all_violators -nosplit}&lt;br /&gt;foreach line [split $rptstring \n] {&lt;br /&gt;if {[string match *VIOLATED* $line]} {&lt;br /&gt;incr TNV } else {&lt;br /&gt;echo $line set TNV 0 }&lt;br /&gt;}&lt;br /&gt;}; # End proc&lt;br /&gt;&lt;br /&gt;说明：&lt;br /&gt;split函数可以用来将string分成list，然后使用foreach来遍历每个元素。&lt;br /&gt;&lt;br /&gt;3.lsearch和string match的使用&lt;br /&gt;lsearch有三个option，-exact，-glob，-regexp 后面紧跟这list，最后是patten。注意list和pattern的先后顺序，与glob命令和regexp是不一样的。返回的值是最先匹配到元素的indice值。可以结合lindex来使用，查看匹配的元素。&lt;br /&gt;string match后面先跟着pattern，最后才是string。返回是否匹配的布尔值。&lt;br /&gt;&lt;br /&gt;4.完善自定义proc的help功能。&lt;br /&gt;使用define_proc_attribute来实现。&lt;br /&gt;define_proc_attributes clean_log \&lt;br /&gt;-info "Removing duplicating timing report" \&lt;br /&gt;-command_group my_goup \&lt;br /&gt;-define_args { {infile "log file to be cleaned" infile} {outfile "cleaned file" outfile}}&lt;br /&gt;&lt;br /&gt;proc clean_log{infile outfile}{&lt;br /&gt;set in_file_hd [open $infile r]&lt;br /&gt;set out_file_hd [open $outfile w]&lt;br /&gt;while {[gets $in_file_hd each_line] != -1} {&lt;br /&gt;puts $out_file_hd $each_line}&lt;br /&gt;close $in_file_hd&lt;br /&gt;close $out_file_hd&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;说明：上面定义的proc有一个不足，就是infile和outfile位置都是固定的，不能颠倒，处于robust的考虑，可以采用clean_log -infile file_name -outfile file_name的方式就好了。可以使用parse_proc_arguments -args $args results，这样程序可以写成如下的形式:&lt;br /&gt;proc clean_log {args} {&lt;br /&gt;parse_proc_arguments -args $args results&lt;br /&gt;set in_file_hd [open $results(-infile) r]&lt;br /&gt;set out_file_hd [open $results(-outfile) w]&lt;br /&gt;……&lt;br /&gt;}&lt;br /&gt;注意在使用这种不需要位置的参数，需要在defien_proc_attribute中来define_args。&lt;br /&gt;&lt;br /&gt;5.关于collection的使用。&lt;br /&gt;如果将collection赋给某个变量，比如下面的命令set allclock [all_clocks]，然后试图在终端查看它，使用echo，你会得到一个_selxx的值，很郁闷把，DC在查看collection的时候，使用了两条专有的命令，一个是query_objects，一个是get_object_name,从名字上就可以看出来，query_objects可以看多具有多个对象的collection内容，而get_object_name只可以查看具有一个对象的collection内容。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-64056776246853555?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/64056776246853555/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=64056776246853555' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/64056776246853555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/64056776246853555'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/tcldc.html' title='tcl在DC中的使用-----part1'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-6774453881028222696</id><published>2008-12-24T09:21:00.005+08:00</published><updated>2008-12-24T11:16:32.890+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_syn'/><title type='text'>register retiming的逻辑综合</title><content type='html'>所谓的register retiming 指的是通过改变寄存器在组合逻辑的位置来达到优化时序和面积的优化技术。一般compile和compile_ultra里面的优化是通过布尔代数来优化组合逻辑，不会改变寄存器的位置。&lt;img id="BLOGGER_PHOTO_ID_5283162512292817778" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 174px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_8ua4DbBBDsg/SVGQUEPfq3I/AAAAAAAAACs/wbz4Eeu9tLY/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5283162729843640562" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 187px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_8ua4DbBBDsg/SVGQgurpyPI/AAAAAAAAAC0/tBYWnDc00_c/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;register retiming有三个命令，optimize_registers，pipeline_registers，balance_registers。其中optimize_registers最常用，可以优化同步寄存器和异步寄存器位置来达到优化时序和面积的目的，而且默认情况下还执行一次增量编译。pipeline_registers主要是用来对纯组合逻辑按照指定的流水级数插入流水线。balance_registers只用来移动寄存器的位置来改善时序，而不会优化面积，也不会执行增量编译。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-6774453881028222696?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/6774453881028222696/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=6774453881028222696' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/6774453881028222696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/6774453881028222696'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/register-retiming.html' title='register retiming的逻辑综合'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8ua4DbBBDsg/SVGQUEPfq3I/AAAAAAAAACs/wbz4Eeu9tLY/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-1616000973453091832</id><published>2008-12-22T14:19:00.007+08:00</published><updated>2008-12-24T12:12:40.286+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_syn'/><title type='text'>复杂clock的综合约束总结</title><content type='html'>1.多clock的关系有三种，同步关系，异步关系和逻辑互斥关系。前两种很容易理解，关键是逻辑互斥关系（logic-exclusive)。这种时钟关系表示时钟之间没有逻辑上的timing path，最常见的例子就是&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;mux&lt;/span&gt;结构的时钟。如下图：&lt;img id="BLOGGER_PHOTO_ID_5282511014809110946" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 118px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SU8_x6_JCaI/AAAAAAAAACM/7YvjdytHEMA/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;对这种结构进行逻辑综合的时候，如何进行设置时钟？method ：首先创建四个时钟，分别是ck1，ck2，ck3，ck4，由于时钟会穿过逻辑门进行分析，因此&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;mux&lt;/span&gt;结构的输出并不需要定义时钟，老版本DC可能只会分析最近定义的一个时钟，DC2007则没有这个问题。如果想查看一下mux的输出管脚的时钟，可以用get_attribute [get_pins mux/Y] clocks来查看。然后就是设置false path的问题，除了ck1和ck3，ck2和ck4有逻辑上时钟路径需要分析外，其余均为逻辑互斥时钟，因此可以定义&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_clock_groups -logically_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;exclusive&lt;/span&gt; -group [get_clocks "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;clk&lt;/span&gt;1 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;clk&lt;/span&gt;3"] -group [get_clocks "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;clk&lt;/span&gt;2 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;clk&lt;/span&gt;4"]&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;来代替众多的set_false_path。&lt;/p&gt;&lt;p&gt;2.create_generated_clock中combinational选项的使用&lt;/p&gt;&lt;p&gt;该选项的意义有两个，一个是告诉DC，分频比为1，一个是告诉DC，在分析network latency的时候，只追溯组合逻辑。&lt;/p&gt;&lt;p&gt;3.时钟截断命令。&lt;/p&gt;&lt;p&gt;对于下面的电路：&lt;/p&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5282539641288160434" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 223px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_8ua4DbBBDsg/SU9Z0M7mdLI/AAAAAAAAACk/2ScgAJR4GW0/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;clkin要求考虑到两个时钟，一个慢时钟，一个快时钟，在输入快时钟时，上半部分有效，在输入为慢时钟时，下半部分有效工作，对于这种电路，如何约束呢？（method：首先在clkin这个port上定义两个时钟，注意使用create_clock的add选项，然后针对每一个时钟设置input_delay。然后最重要的就是将某些时钟剔除，比如lsdin_reg只有在慢时钟才有效工作。那么就在在该寄存器的时钟输入端剔除快时钟，剔除的命令就是&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_clock_sense -stop_propagation -clock hclk [get_pins lsd*_reg/CP]&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_clock_sense -stop_propagation -clock lclk [get_pins hsd*_reg/CP]&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-1616000973453091832?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/1616000973453091832/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=1616000973453091832' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1616000973453091832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1616000973453091832'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/clock.html' title='复杂clock的综合约束总结'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8ua4DbBBDsg/SU8_x6_JCaI/AAAAAAAAACM/7YvjdytHEMA/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-9084877764557736054</id><published>2008-12-19T16:10:00.002+08:00</published><updated>2008-12-19T16:20:48.613+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='worklife'/><title type='text'>the next two days plan</title><content type='html'>1.bist learning,especially mbist&lt;br /&gt;&lt;br /&gt;2.linux study&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-9084877764557736054?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/9084877764557736054/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=9084877764557736054' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9084877764557736054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9084877764557736054'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/next-two-days-plan.html' title='the next two days plan'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-2823521770391828031</id><published>2008-12-19T09:04:00.008+08:00</published><updated>2008-12-19T16:08:07.318+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_test'/><title type='text'>全速测试(at speed test)</title><content type='html'>在工艺节点在130nm以下的时候，很多情形下的物理缺陷都是由于延时来引起的。因此在对这种类型的chip做dft的时候，需要建立一个新的故障模型，业内称之为延时故障模型（time delay model）。解决的方法就是全速测试，所谓的全速测试就是让芯片工作在自己高倍时钟频率上，这个频率往往是要高过ATE的时钟的。这样对扫描模型的建立就提出了新的要求。即至少要保证芯片的latch clock和capture clock为芯片内部的高倍时钟。synopsys对此种问题的解决方法就是OCC（on chip clocking）。&lt;img id="BLOGGER_PHOTO_ID_5281368133792497842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 173px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_8ua4DbBBDsg/SUswVfbFALI/AAAAAAAAACE/wxvqxmfEgtw/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;DFT Compiler支持两种模式的带OCC的扫描链插入，一种是自身的设计已经带上OCC电路的，另一种是不带OCC电路的。&lt;br /&gt;下面分别说说这两种插入的流程。&lt;br /&gt;1.OCC的自动插入&lt;br /&gt;&lt;ul&gt;&lt;li&gt;使能occ的插入，使用的命令是 &lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;blockquote&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_configuration -clock_controller enable&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;定义时钟，包括参考时钟，ATE时钟，PLL产生的时钟。&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;参考时钟的定义：如果周期跟默认的测试周期相同，定义方法&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view existing_dft -type MasterClock -port my_clock -timing {45 55} &lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view exsiting_dft -type refclock -port my_clock -period 100 -timing {45 55}&lt;/p&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;如果周期不同，就只需要定义refclock，不需要定义MasterClock&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view exsiting_dft -type refclock -port my_clock -period 10 -timing {4 6}&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000000;"&gt;ATE时钟的定义：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view exsiting_dft -type ScanClock -port ate_clock -timing {45 55}&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view exsiting_dft -type Oscillator -port ate_clock&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;PLL产生时钟的定义：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view existing_dft -type Oscillator -hookup_pin pll/clk1&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view existing_dft -type Oscillator -hookup_pin pll/clk2&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;指定全局信号，包括pll_bypass，pll_reset，ScanEnble,TestMode&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view spec -type pll_reset -port pll_rst&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view spec -type pll_bypass -port pll_bp&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view spec -type ScanEnable -port scan_en&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;set_dft_signal -view spec -type TestMode -port test_en&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;clock controller的设置&lt;/li&gt;&lt;/ul&gt;&lt;span style="color:#3333ff;"&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;set_dft_clock_controller -cell_name u1 -design_name occ_clock_mux&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;-pllclocks [pll/clk1 pll/clk2] -ateclocks [ate_clock]&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;-cycles_per_clock 2&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;scan_configuration的设置&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;2.OCC已经存在&lt;/p&gt;&lt;p&gt;这种情况下由于OCC已经插入，因此命令set_dft_clock_controller在这里已经没有意义了，这里需要让DFT知道occ输出时钟信号的属性，使用的方法还是set_dft_signal。另外需要指定clock chains，使用set_scan_path来指定，将其complete化。另外如果使用到adaptive scan，注意test mode在两种模式下都必须指定啊。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-2823521770391828031?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/2823521770391828031/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=2823521770391828031' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2823521770391828031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2823521770391828031'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/at-speed-test.html' title='全速测试(at speed test)'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8ua4DbBBDsg/SUswVfbFALI/AAAAAAAAACE/wxvqxmfEgtw/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-5541175126107972588</id><published>2008-12-17T15:55:00.010+08:00</published><updated>2008-12-17T19:16:52.591+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_test'/><title type='text'>illinois扫描结构</title><content type='html'>一个芯片的测试成本主要受到三个因素的影响，第一个就是测试的时间，就是将所有的测试向量灌到芯片里面，并收集结果所花费的时间。第二个就是测试数据的数量，第三个就是测试的管脚。举一个IBM chip的例子，设计逻辑部分有7 百万个门，有25万个寄存器单元，采用full scan的结构，如下图:&lt;img id="BLOGGER_PHOTO_ID_5280666889627014530" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 40px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_8ua4DbBBDsg/SUiyjtVilYI/AAAAAAAAABE/QQc4_T7yk2g/s320/sca.JPG" border="0" /&gt;假设需要的测试向量为7000个，则移位寄存器需要消耗的测试时间为7000*250000=1.75G cycle。假设测试时钟周期是100M，则需要耗时17.5s。需要消耗的memory为1.75G bit。很庞大，是把。怎么解决呢，容易想到的就是将这个扫描链的长度减小，用多个扫描链来替代，结构如下图： &lt;div&gt;&lt;img id="BLOGGER_PHOTO_ID_5280669113101735554" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 393px; CURSOR: hand; HEIGHT: 210px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_8ua4DbBBDsg/SUi0lIbOVoI/AAAAAAAAABM/Khe01NCWtXY/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;将这一个长的扫描链分解成1000个250个长度的扫描链，这样移位寄存器的load time就减少到以前的1/1000，但是付出的代价是测试管脚增加了太多，一方面芯片不可能提供这么多管脚做DFT，另外一般的ATE只有10到200个扫描信道，所以说上面的方案仍然需要改进。选取2500个寄存器做个一个扫描链的长度，这样就将扫描信道减小到100，就可以忍忍使用了。需要注意的是，这种并行的方法只是减少了数据的load的时间，数据量并没有减少。 能不能有一种方法能减少load time，同时又能减小pin和data volume的？illinois就是其中的一种方法。具体原理见下图：&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5280674067963448354" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 157px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_8ua4DbBBDsg/SUi5FiuUDCI/AAAAAAAAABU/ky9E8Pcy6To/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;/div&gt;&lt;div&gt;上图的四个扫描链共享一个scan data输入，这样减小了pin的使用，但是这样会有问题，就是覆盖率的问题。见下图&lt;img id="BLOGGER_PHOTO_ID_5280675687973812674" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 276px; CURSOR: hand; HEIGHT: 173px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SUi6j1u4ecI/AAAAAAAAABc/IBUKSCg-9oE/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;对于上面的与门，输入只会出现两种情况，一种就是000，一种就是111，不会出现其他的情况，这样就会减低故障覆盖率。这怎么办才好么？方法就是采用两种模式相结合的方式。下图：&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img id="BLOGGER_PHOTO_ID_5280678953305023938" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 179px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SUi9h6CgpcI/AAAAAAAAABk/A8QetgjdpnE/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt; 下面的几个图是说明使用illinois扫描结构效果的示意图：&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/SUi_T5Fat-I/AAAAAAAAABs/A6FL-2ZJkx8/s1600-h/æœªå‘½å.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5280680911553869794" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand; HEIGHT: 230px" alt="" src="http://4.bp.blogspot.com/_8ua4DbBBDsg/SUi_T5Fat-I/AAAAAAAAABs/A6FL-2ZJkx8/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.JPG" border="0" /&gt;&lt;/a&gt; &lt;a href="http://2.bp.blogspot.com/_8ua4DbBBDsg/SUi_tqupXzI/AAAAAAAAAB0/QwcxgvqVs78/s1600-h/æœªå‘½å.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5280681354376863538" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 218px" alt="" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/SUi_tqupXzI/AAAAAAAAAB0/QwcxgvqVs78/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5280682029835324946" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 232px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_8ua4DbBBDsg/SUjAU_AfjhI/AAAAAAAAAB8/YI92vghrSGE/s320/%E6%9C%AA%E5%91%BD%E5%90%8D.bmp" border="0" /&gt; 效果很好，但是有一个选择分组的问题，也就是说把哪些扫描链共享一个scan_in。分组的原则就是将对覆盖率的损害降到最低。&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-5541175126107972588?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/5541175126107972588/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=5541175126107972588' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/5541175126107972588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/5541175126107972588'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/illinois.html' title='illinois扫描结构'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_8ua4DbBBDsg/SUiyjtVilYI/AAAAAAAAABE/QQc4_T7yk2g/s72-c/sca.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-9202065852867417679</id><published>2008-12-16T13:25:00.003+08:00</published><updated>2008-12-17T19:18:17.954+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_test'/><title type='text'>DFT Compiler的学习------part8 tips and tricks</title><content type='html'>1.down-top的扫描链插入处理。&lt;br /&gt;&lt;br /&gt;主要的考虑是在顶层直接处理会造成占用内存太大，容易溢出。采取的方法是层次化插入扫描链，先对底层的模块进行扫描链插入，插入完毕后，写出test model，并且释放内存。test model的形式有两种，一种是ddc形式，一种是ctl形式。ctl形式是可以查看内容的，是用ascii文件表示的。如果整个流程呢个都是galaxy流程的化，最好使用ddc的格式。释放内存remove_design就可以了。对底层模块都插入完毕后，在顶层首先是读入各个test model。使用的命令是read_ddc或者是read_test_model。注意这里read_ddc读入的不是底层模块的网表，而是test model。读入test model 之后，使用use_test_model -true [design]来指定，然后该干啥就干啥。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-9202065852867417679?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/9202065852867417679/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=9202065852867417679' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9202065852867417679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/9202065852867417679'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part8-tips-and-tricks.html' title='DFT Compiler的学习------part8 tips and tricks'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-6693256746812833962</id><published>2008-12-15T09:39:00.004+08:00</published><updated>2008-12-15T16:47:18.665+08:00</updated><title type='text'>DFT Compiler的学习------part7 DFTMAX</title><content type='html'>DFTMAX的核心就是adaptive scan技术。所谓的adaptive scan类似于边界扫描，不同的是在chip扫描信号和内部多个扫描链之间插入压缩和解压缩逻辑。目的就是为了减少测试的时间和测试的数据。&lt;br /&gt;&lt;br /&gt;1.使能adaptive scan&lt;br /&gt;在set_dft_configuration的选项里面有一个scan_compression，将其enable，就可以了。这样在使用insert_dft的时候，就会产生两种测试的模式，一种是scan compression模式，扫描单元由压缩单元进行驱动，一种是internal scan模式，扫描单元由外部信号进行驱动。&lt;br /&gt;&lt;br /&gt;2.多种测试模式的支持。&lt;br /&gt;上面提到在使用scan_compression的时候，会产生两种测试的模式。当然也可以自定义test mode。使用命令define_test_mode mode_label -usage mode_usage。mode_usage可以为scan或者为scan_compression。&lt;br /&gt;&lt;br /&gt;3.如果设置扫描链的个数。&lt;br /&gt;在scan的test mode下，可以使用set_scan_configuration -chain_count X来设置，在scan compression 的mode 下，可以使用set_scan_compression_configuration -minimum_compression x来设置（默认为10）。得到的chain的个数为chain_count*comp*1.2&lt;br /&gt;&lt;br /&gt;4.test mode的信号设置&lt;br /&gt;在使用adaptive scan的时候，需要插入一个test mode 信号，用来选择是压缩的模式还是基本的模式。在使用autofix的时候，也需要一个test mode，用来选择是否使能修复逻辑。这两个test mode不能共用一个port。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-6693256746812833962?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/6693256746812833962/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=6693256746812833962' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/6693256746812833962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/6693256746812833962'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part7-tips.html' title='DFT Compiler的学习------part7 DFTMAX'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-3139438472054003174</id><published>2008-12-12T09:02:00.009+08:00</published><updated>2008-12-12T13:59:00.765+08:00</updated><title type='text'>DFT Compiler的学习-----part6 report和输出文件</title><content type='html'>1.preview_dft&lt;br /&gt;&lt;br /&gt;功能：在做inser_dft之前查测试点的信息，扫描链的信息。根据这些信息来确定所加的dft 规格是否完备。&lt;br /&gt;&lt;br /&gt;一般是在规则写完并进行dft_drc之后，用此命令查看信息。最常用的就是默认的不带任何option的preview_dft，下面是一个preview_dft的报告。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;****************************************&lt;br /&gt;Preview_dft report&lt;br /&gt;For : 'Insert_dft' command&lt;br /&gt;Design : clk&lt;br /&gt;Version: X-2005.09-SP4&lt;br /&gt;Date : Fri Dec 12 09:55:48 2008&lt;br /&gt;****************************************&lt;br /&gt;Number of chains: 1&lt;br /&gt;Scan methodology: full_scan&lt;br /&gt;Scan style: multiplexed_flip_flop&lt;br /&gt;Clock domain: mix_clocks&lt;br /&gt;Scan enable: scan_en (no hookup pin)&lt;br /&gt;Scan chain '1' (data_in[0] --&gt; data_out[0]) contains 31 cells&lt;br /&gt;&lt;br /&gt;************ Test Point Plan Report ************&lt;br /&gt;Total number of test points : 1&lt;br /&gt;Number of Autofix test points: 1&lt;br /&gt;Number of Wrapper test points: 0&lt;br /&gt;Number of test modes : 1&lt;br /&gt;Number of test point enables : 0&lt;br /&gt;Number of data sources : 1&lt;br /&gt;Number of data sinks : 0&lt;br /&gt;**************************************************&lt;br /&gt;Dft signals:&lt;br /&gt;TestData: clk_in (no hookup pin)&lt;br /&gt;TestMode: test_en (no hookup pin)&lt;br /&gt;&lt;br /&gt;最常用的还有preview_dft show all和preview_dft -test_points all&lt;br /&gt;&lt;br /&gt;2.insert_dft&lt;br /&gt;功能：将非扫描的触发器用扫描的触发器替代，添加额外的逻辑来提高fc（需启动autofix），执行增量编译来修复timing和DRC错误。&lt;br /&gt;&lt;br /&gt;3.dft_drc -coverage_estimate&lt;br /&gt;功能：执行DRC检查和测试覆盖率的分析，在insert_dft命令之后执行。下面是一个报告。&lt;br /&gt;&lt;br /&gt;In mode: Internal_scan...&lt;br /&gt;Design has scan chains in this mode&lt;br /&gt;Design is scan routed&lt;br /&gt;Post-DFT DRC enabled&lt;br /&gt;Information: Starting test design rule checking. (TEST-222)&lt;br /&gt;Loading test protocol&lt;br /&gt;...basic checks...&lt;br /&gt;...basic sequential cell checks...&lt;br /&gt;...checking vector rules...&lt;br /&gt;...checking clock rules...&lt;br /&gt;...checking scan chain rules...&lt;br /&gt;...checking scan compression rules...&lt;br /&gt;...checking X-state rules...&lt;br /&gt;...checking tristate rules...&lt;br /&gt;...extracting scan details...&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;DRC Report&lt;br /&gt;Total violations: 0&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;Test Design rule checking did not find violations&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;Sequential Cell Report&lt;br /&gt;0 out of 31 sequential cells have violations&lt;br /&gt;-----------------------------------------------------------------&lt;br /&gt;SEQUENTIAL CELLS WITHOUT VIOLATIONS * 31 cells are valid scan cells&lt;br /&gt;&lt;br /&gt;Information: Test design rule checking completed. (TEST-123)&lt;br /&gt;Running test coverage estimation...&lt;br /&gt;1394 faults were added to fault list.&lt;br /&gt;ATPG performed for stuck fault model using internal pattern source.&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;#patterns #faults #ATPG faults test process stored detect/active red/au/abort coverage CPU time&lt;br /&gt;--------- ------------- ------------ -------- --------&lt;br /&gt;Begin deterministic ATPG:&lt;br /&gt;#uncollapsed_faults=1099,&lt;br /&gt;abort_limit=10... 0 1098 1 0/0/0 99.35% 0.02 0 1 0 0/0/0 99.42% 0.03&lt;br /&gt;Pattern Summary Report&lt;br /&gt;-----------------------------------------------&lt;br /&gt;#internal patterns 0&lt;br /&gt;-----------------------------------------------&lt;br /&gt;Uncollapsed Stuck Fault Summary Report&lt;br /&gt;-----------------------------------------------&lt;br /&gt;fault class code #faults&lt;br /&gt;------------------------------ ---- ---------&lt;br /&gt;Detected DT 1372 Possibly detected PT 0 Undetectable UD 14 ATPG untestable AU&lt;br /&gt;8 Not detected ND 0&lt;br /&gt;test coverage 99.42%&lt;br /&gt;-----------------------------------------------&lt;br /&gt;Information: The test coverage above may be inferior than the real test coverage with customized protocol and test simulation library.&lt;br /&gt;&lt;br /&gt;4.report_scan_configuration&lt;br /&gt;功能：报告scan的配置信息&lt;br /&gt;&lt;br /&gt;****************************************&lt;br /&gt;Report : Scan configuration&lt;br /&gt;Design : clk&lt;br /&gt;Version: X-2005.09-SP4&lt;br /&gt;Date : Fri Dec 12 12:47:49 2008&lt;br /&gt;****************************************&lt;br /&gt;========================================&lt;br /&gt;TEST MODE: all_dft&lt;br /&gt;VIEW : Specification&lt;br /&gt;========================================&lt;br /&gt;Chain count: 1&lt;br /&gt;Scan Style: Multiplexed flip-flop&lt;br /&gt;Maximum scan chain length: Undefined&lt;br /&gt;Physical Partitioning: Horizontal&lt;br /&gt;Replace: True&lt;br /&gt;Preserve multibit segments: True&lt;br /&gt;Clock mixing: Mix clocks&lt;br /&gt;Internal clocks: none&lt;br /&gt;Add lockup: TrueLockup&lt;br /&gt;type: latchInsert&lt;br /&gt;terminal lockup: False&lt;br /&gt;Create dedicated scan out ports: False&lt;br /&gt;Shared scan in: 0&lt;br /&gt;Bidirectional mode: No bidirectional type&lt;br /&gt;Minimize Hold Time Violations: False&lt;br /&gt;Maximum Addtional Wire Length (%): Undefined&lt;br /&gt;Test Clocks by System Clocks: False&lt;br /&gt;Hierarchical Isolation: False&lt;br /&gt;Multiple Scan Enable: Disable&lt;br /&gt;Pipeline Scan Enable: Disable&lt;br /&gt;Voltage Mixing: False&lt;br /&gt;&lt;br /&gt;5.report_dft_signal&lt;br /&gt;功能：报告由set_dft_signal设置的内容项，可以分成-view spec和-view existing_dft分着报&lt;br /&gt;&lt;br /&gt;6.report_scan_path&lt;br /&gt;功能：报告由set_scan_path指定的path和insert_dft插入的scan path。&lt;br /&gt;选项：-view当指定spec的时候，报告set_scan_path指定的路径，当指定为existing_dft的时候，报告由insert_dft插入的scan path.&lt;br /&gt;-chain指定报告的具体chain，如要报告所有的chain，使用all。&lt;br /&gt;-cell报告指定chain的cell。&lt;br /&gt;&lt;br /&gt;总结:&lt;br /&gt;&lt;br /&gt;#write out scan reports&lt;br /&gt;&lt;br /&gt;report_scan_configuration &gt; reports/scan_config&lt;br /&gt;&lt;br /&gt;report_dft_signal -view existing_dft &gt; reports/dft_signals&lt;br /&gt;&lt;br /&gt;report_scan_path -view existing_dft -chain all &gt; reports/scan_chains&lt;br /&gt;&lt;br /&gt;report_scan_path -view existing_dft -cell all &gt; reports/scan_cells&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#write out netlist and spf file for Tetramax&lt;br /&gt;&lt;br /&gt;change_names -rules verilog -hier&lt;br /&gt;&lt;br /&gt;set test_stil_netlist_format verilog&lt;br /&gt;&lt;br /&gt;write -format ddc -hierarchy -output mapped_scan/RISC_CORE.ddc&lt;br /&gt;&lt;br /&gt;write -f verilog -h -o tmax/RISC_CORE_SCAN.v&lt;br /&gt;&lt;br /&gt;write_test_protocol -o tmax/RISC_CORE_SCAN.spf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-3139438472054003174?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/3139438472054003174/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=3139438472054003174' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3139438472054003174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/3139438472054003174'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part6-report.html' title='DFT Compiler的学习-----part6 report和输出文件'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-2743443799627203784</id><published>2008-12-11T09:36:00.006+08:00</published><updated>2008-12-11T11:15:42.763+08:00</updated><title type='text'>DFT Compiler的学习-----part5 Autofix的使用</title><content type='html'>Autofix可以自动修正一些test DRC的错误，比如：不可控的时钟，不可控的异步置位和复位信号，以及三态和双向信号。举个例子，比如一个寄存器的时钟输入是不可控的，如果启动了autofix的功能，则会在时钟输入端添加一个mux，由testMode信号来控制。需要注意的是这里的testMode信号和ScanEnable信号是不一样的。ScanEnable信号是控制扫描链数据的移动和抓取的。而testMode信号必须在整个测试周期内都必须有效。&lt;br /&gt;&lt;br /&gt;如何使用autofix呢？首先需要时能test point的autofix行为，具体命令是set_dft_configuration。注意与set_scan_configuration的区别。前者是对test point进行配置的，而后者是对扫描链进行配置的。比如想启动clock的autuofix的功能，就使用set_dft_configuration -fix_clock enable。其次是指定test point的信号。使用set_dft_signal -type来指定，这里test point的类型有两种，一种是TestData，比如clock信号，异步置位复位信号，一种是TestMode，用来对这些TestData信号进行控制。最后就是指定autofix的行为。使用的命令是set_autofix_configuration和set_autofix_element。比如&lt;br /&gt;set_autofix_configuration -type clock -test_data clk -control_signal my_test_mode&lt;br /&gt;&lt;br /&gt;这个单元涉及到的主要命令有set_dft_configuration，set_autofix_configuration，set_autofix_element。下面着重对他们的使用方法做说明。&lt;br /&gt;&lt;br /&gt;1.set_dft_configuration&lt;br /&gt;&lt;br /&gt;用途：对test point进行配置。&lt;br /&gt;选项：-fix_clock，-fix_set，-fix_reset，-fix_bus，-fix_bidirectional，-fix_xpropagation都是用来使能或者禁止autofix功能的。&lt;br /&gt;&lt;br /&gt;2.set_autofix_configuration&lt;br /&gt;&lt;br /&gt;用途：对autofix的行为进行配置。&lt;br /&gt;选项：-type指定fix的类型，有clock，set，reset，x_propagation，internal_bus，external_bus，bidirectional，每次只能指定一个类型。&lt;br /&gt;-control_signal 指定test_control的信号，这个信号应该预先定义的TestMode或者ScanEnable信号，如果没有指定该选项，则autofix会被任何一个TestMode信号来控制，如果没有预先没有定义该信号，则autofix会自己创建一个。&lt;br /&gt;-test_data指定test_data信号。比如一个clk port，如果要使用autofix，除了要将其配置成具有clocktype之外，还需要配置成test_data，如果没有配置成test_data，将会自己寻找。&lt;br /&gt;-method指定autofix的方法。对不同的type有不同的默认方法。比如对异步set和reset，使用mux，对内部总线enable_one，对外部总线使用disable_all，对双向信号使用input。&lt;br /&gt;-fix_data使能时则对时钟信号作为寄存器data输入的情况进行自动修复。&lt;br /&gt;-include_element -exclude_element指定autofix适用的design。&lt;br /&gt;&lt;br /&gt;3.set_autofix_element&lt;br /&gt;用途：对某个具体的element实施autofix的配置，选项跟set_autofix_configuration差不多。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-2743443799627203784?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/2743443799627203784/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=2743443799627203784' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2743443799627203784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2743443799627203784'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part5-autofix.html' title='DFT Compiler的学习-----part5 Autofix的使用'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-2966103812645039852</id><published>2008-12-09T16:16:00.005+08:00</published><updated>2008-12-10T15:23:28.246+08:00</updated><title type='text'>DFT Compiler的学习-----part4 构建test design</title><content type='html'>本学习单元为DFT compiler的重点内容。&lt;br /&gt;&lt;br /&gt;准备好设计之后，就可以考虑构建test design。&lt;br /&gt;&lt;br /&gt;1.DFT规格的指定。&lt;br /&gt;&lt;br /&gt;1.1 扫描链的构建&lt;br /&gt;&lt;br /&gt;利用set_scan_configuration来对全局的scan chain进行配置。比如扫描链的类型，长度，个数等&lt;br /&gt;&lt;br /&gt;等信息。利用set_dft_signal来对指定test port管脚。这些都是全局性的配置。&lt;br /&gt;&lt;br /&gt;除了对全局性的scan chain进行配置之外，也可以对某个特定的scan path进行配置。&lt;br /&gt;&lt;br /&gt;利用set_scan_path来对scan path进行配置，这条命令可以对scan chain命名，指定扫描链的长度&lt;br /&gt;&lt;br /&gt;等等，功能很强大。option很多，建议看看man文档，这里挑几个常用的来说明。&lt;br /&gt;&lt;br /&gt;&lt;1&gt; exact_length：指定某个扫描链的长度。例如：&lt;br /&gt;&lt;br /&gt;set_scan_path chain_name1 -exact_length 10&lt;br /&gt;&lt;br /&gt;如果要对整个扫描链设置长度。使用set_scan_configuration -exact_length来设置。&lt;br /&gt;&lt;br /&gt;&lt;2&gt;complete trulefalse ：指定当前的扫描链是否完备，如果完备，则insert_dft不会添加新的&lt;br /&gt;&lt;br /&gt;scan cell来balance 扫描链，否则就可以添加。&lt;br /&gt;&lt;br /&gt;如何控制routing order呢？可以通过set_scan_path的-ordering_list选项来指定顺序。&lt;br /&gt;&lt;br /&gt;一般扫描单元有两个输出，一个是scan_out,一个是其反相scan_out_inverted，DFT会根据时序&lt;br /&gt;&lt;br /&gt;选择一个好的，如果要改变默认的行为，可以将变量test_disable_find_best_scan_out置为&lt;br /&gt;&lt;br /&gt;true。&lt;br /&gt;&lt;br /&gt;如何对扫描链进行重新连线呢？一般DFT为了优化设计，会进行下面的处理：会对扫描单元做单&lt;br /&gt;&lt;br /&gt;独的优化来满足时序等信息，如果插入的扫描单元不满足test DRC，会在insert_dft的时候，将其&lt;br /&gt;&lt;br /&gt;还原成原先的非扫描结构的形式。&lt;br /&gt;&lt;br /&gt;如果不考虑优化来连接扫描链呢？这又叫做快速扫描链综合，比如在top层做扫描链，底层的扫描&lt;br /&gt;&lt;br /&gt;链都已经优化好了，在顶层只需要将其连接起来就可以了。又比如不想在logic综合中优化，而是&lt;br /&gt;&lt;br /&gt;放在后面的物理设计中优化，也可以先直接将扫描链先连接起来。可以使用命令&lt;br /&gt;&lt;br /&gt;set_scan_replacement -none_scan none_scan_cell_list -multiplexed_flip_flop scan_cell。&lt;br /&gt;&lt;br /&gt;注意上面的命令的option必须成对出现，而且scan_cell只能有一个。&lt;br /&gt;&lt;br /&gt;1.2 扫描信号的构建&lt;br /&gt;&lt;br /&gt;如何抑制某些时序单元的scan替代呢？使用set_scan_element -false cell_list来实现。&lt;br /&gt;&lt;br /&gt;如何对三态信号进行处理呢？为了防止出现bus竞争和bus漂移，DFT会在scan_shift的时候保证&lt;br /&gt;&lt;br /&gt;只有一个drive。DFT会自动判断内部的三态逻辑是否满足一个drive有效的要求，如果不满足，&lt;br /&gt;&lt;br /&gt;会自动在内部添加逻辑来满足要求。如果设计的逻辑本身已经加入了此种逻辑，则可以使用命令&lt;br /&gt;&lt;br /&gt;让DFT不用加入该disable逻辑。使用的命令是set_dft_configuration -fix_bus disable。如果采用&lt;br /&gt;&lt;br /&gt;bottom-up的方式来插入扫描链，需要注意在底层可以将fix_bus disable掉，但顶层需要将其&lt;br /&gt;&lt;br /&gt;enable。&lt;br /&gt;&lt;br /&gt;如何对双向端口进行处理呢？同上面处理三态的方法一样，如果设计本身就包含处理的模块，那&lt;br /&gt;&lt;br /&gt;么可以使用set_dft_configuration -fix_bidirectional false。同理，DFT也提供了对特定的双向端&lt;br /&gt;&lt;br /&gt;口处理和全局的双向端口处理的命令。对特定的双向端口处理，可以使用set_auto_element的命&lt;br /&gt;&lt;br /&gt;令。&lt;br /&gt;&lt;br /&gt;如何控制lock-up element的插入？如果相邻的时序cell是由不同的时钟来驱动的，那么DFT会默&lt;br /&gt;&lt;br /&gt;认在cell之间插入一个lock-up element。可以通过set_scan_configuration -add_lockup truelfalse&lt;br /&gt;&lt;br /&gt;来指定，也可以通过选项 -lockup_type latchflip_flop来选择插入的lock-up element的类型。&lt;br /&gt;&lt;br /&gt;1.3 测试时钟的构建&lt;br /&gt;&lt;br /&gt;需要特别注意的是多时钟的构建，DFT在默认的时候是为每个时钟域创建一个scan chain，当然可&lt;br /&gt;&lt;br /&gt;以使用set_scan_configuration -clock_mixing mixing_clocks就允许多个时钟域的信号位于同一个&lt;br /&gt;&lt;br /&gt;扫描链上。&lt;br /&gt;&lt;br /&gt;还有就是内部时钟。默认情况下DFT在处理的时候会将所有内部时钟都由顶层定义的test clock来&lt;br /&gt;&lt;br /&gt;驱动。可以通过设置set_scan_configuration的-internal_clocks multi选项来将其当作不同的时&lt;br /&gt;&lt;br /&gt;钟，这样如果没有mixing的化，将会创建出两条扫描链，如果mixing的化，将会加入lock-up单&lt;br /&gt;&lt;br /&gt;元。&lt;br /&gt;&lt;br /&gt;2.post_scan DRC的检查。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-2966103812645039852?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/2966103812645039852/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=2966103812645039852' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2966103812645039852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/2966103812645039852'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part4-test-design.html' title='DFT Compiler的学习-----part4 构建test design'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-7274604863864244123</id><published>2008-12-09T14:12:00.004+08:00</published><updated>2008-12-11T11:19:56.654+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_test'/><title type='text'>DFT Compiler的学习------part3 pre-scan的test DRC</title><content type='html'>关于pre-scan的test DRC问题&lt;br /&gt;1.test DRC的流程&lt;br /&gt;很简单，只要注意到只有在创建test_protocol之后才可能test DRC检查。&lt;br /&gt;&lt;br /&gt;2.test DRC后时序单元的分类&lt;br /&gt;分为两类，一类是有违例的，一类是没有违例的，需要对违例的时序单元进行违例排除。&lt;br /&gt;&lt;br /&gt;3.模型的违例&lt;br /&gt;黑盒违例：在链接库中找不到该cell。需要查看链接库是不是没有给全。DFTC会将黑盒看成一个时序单元。latch违例：DFTC找不到带扫描链的latch，就会把latch当成黑盒来处理。&lt;br /&gt;&lt;br /&gt;4.设置时序的属性&lt;br /&gt;两种strobe协议：一种是strobe_after_clock，一种是strobe_before_clock。默认是strobe_after_clock的。几个时序属性：test_default_period：定义测试周期，如果测试仪和被测芯片允许，可以设更小的值，默认是100ns。test_default_delay：定义输入延时，缺省值为5。test_default_bidir_delay：定义双向端口的时序。test_default_strobe:定义探测点的位置test_default_strobe_width：定义探测的宽度，默认为0。&lt;br /&gt;&lt;br /&gt;5.创建测试协议&lt;br /&gt;使用的命令就是create_test_protocol的方法。&lt;br /&gt;&lt;br /&gt;6.屏蔽DRC错误&lt;br /&gt;DRC错误按照严重程度可以分为：error，warning，ignore。可以使用set_dft_drc_rules来对某种错误进行降低或者升级处理，使用的方法就是set_dft_drc_rules -error XXX -cells YYY如果要恢复到默认的等级，可以使用reset_dft_drc_rules。如果要查看DRC错误的等级，可以使用report_dft_drc_rules。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-7274604863864244123?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/7274604863864244123/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=7274604863864244123' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7274604863864244123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7274604863864244123'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-part3.html' title='DFT Compiler的学习------part3 pre-scan的test DRC'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-7384048995162884525</id><published>2008-12-09T08:58:00.008+08:00</published><updated>2008-12-11T11:22:24.513+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_test'/><title type='text'>DFT Compiler的学习-----part2 scan replacement</title><content type='html'>今天着重分析下扫描单元替换（scan replacement）的内容。所谓scan replacement，顾名思意就是在设计中用扫描单元替代非扫描单元。如果设计是以RTL形式给出的，则在RTL综合成门级网表的过程中自动插入扫描单元。如果设计是以门级网表给出来的，则专门做一次扫描替换。&lt;br /&gt;&lt;br /&gt;流程：1.选择扫描链的策略---&gt; 2.test DRC检查---&gt; 3.带扫描链的综合&lt;br /&gt;&lt;br /&gt;在做扫描链之前，还需要考虑下面问题：&lt;br /&gt;1 .根据目前设计的格式，选择插入扫描链的流程。&lt;br /&gt;如果是RTL或者未优化的门级设计，则采用test-ready Compile，如果是优化的门级设计，采用constraint-optimized 插入方式。test-ready Compile包括逻辑优化和扫描链插入。采用的命令就是 compile -scan。优点就是流程简单，能够得到更好时序和面积。注意test-ready Compile只是将单元替代，并没有将扫描单元连接起来。&lt;br /&gt;&lt;br /&gt;2.找出扫描替代的障碍。&lt;br /&gt;障碍有很多种啊，比如本身工艺库就不提供扫描单元，或者某些寄存器找不到相对应的扫描单元，或者设计本身有dont_touch属性或者scan_element属性为false等等。&lt;br /&gt;（set_scan_element truefalse [get_cells ADA])&lt;br /&gt;扫描链类型本身有带mux的寄存器，LSSD，clocked SD。具体选择那一个要考虑到工艺库和本身的设计，一般采用带mux的寄存器。有两种方式来设置扫描链的类型，一种就是设计test_default_scan_style变量。设置的方法跟tcl设置变量的方法一样，默认的是multiplexed_flip_flop。另一种设置的方式是set_scan_configuration -style来设置。&lt;br /&gt;（tips：如何查看typical库中是否有扫描单元呢。&lt;br /&gt;&lt;strong&gt;get_pins typical/*/* -filter "signal_type==test_scan_in")&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;在插入扫描链的过程中，可以指定扫描单元。使用的命令是set_scan_register_type。选项有- exact和-type，如果使用了exact选项，则在后面的优化过程中（compile -increment）仍然会保留只使用type列表中的扫描单元。（注意DC命令中类似的命令就是set_register_type)。&lt;br /&gt;&lt;br /&gt;下面说说constraint-optimized的扫描链插入流程。包括插入扫描链，根据约束优化扫描逻辑，修正DRC错误。对于这种流程，输入可以是优化后的门级网表，可以不包含扫描单元，也可以包含扫描单元。这里需要用到的命令有：&lt;br /&gt;set_drc_configuration&lt;br /&gt;preview_dft.&lt;br /&gt;这些命令以后再深入学习把。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_8ua4DbBBDsg/ST3rVivs1eI/AAAAAAAAAAs/gmrF3pJb7Lc/s1600-h/scan.bmp"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-7384048995162884525?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/7384048995162884525/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=7384048995162884525' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7384048995162884525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7384048995162884525'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-day2.html' title='DFT Compiler的学习-----part2 scan replacement'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-4134859426417496408</id><published>2008-12-08T14:30:00.007+08:00</published><updated>2008-12-09T14:14:30.578+08:00</updated><title type='text'>DFT Compiler的学习------part1</title><content type='html'>一、定义测试协议&lt;br /&gt;1.set_dft_signal：&lt;br /&gt;功能：用来指定输入输出端口为DFT信号。&lt;br /&gt;选项：&lt;br /&gt;view ---有两种类型，一种是existing_dft，一种是spec。所谓existing_dft，就是告诉工具，这个port已经被用作某种类型的DFT信号了，此时扫描链已经插入了。所谓spec，就是告诉工具，下面指定的port将被用做某种类型的DFT信号。&lt;br /&gt;type---用于指定DFT信号的类型，包括：Reset,Constant,TestMode,TestData,ScanDataIn,ScanDataOut,ScanMasterClock,ScanSlaveClock等。&lt;br /&gt;port---用于指定规则适用的端口。&lt;br /&gt;active_state---用于指定Reset，ScanEnable，TestMode，Constant是高电平有效，还是低电平有效。&lt;br /&gt;timing---用于指定ScanClock的波形。&lt;br /&gt;例子：&lt;br /&gt;set_dft_signal -view existing_dft -type ScanClock -timing {45 55} -port Clk&lt;br /&gt;set_dft_signal -view existing_dft -type Reset -active_state 0 -port Reset&lt;br /&gt;&lt;br /&gt;2. create_test_protocol:&lt;br /&gt;功能：根据当前设计指定的规则，比如set_dft_signal，set_scan_path，set_scan_configuration。来创建测试协议。&lt;br /&gt;选项：infer_clock，infer_asynth。如果先前没有对clock和异步信号进行指定，可以由DFT Compiler自己去判断哪个是clock,哪个是异步信号。（不推荐）。&lt;br /&gt;&lt;br /&gt;创建完测试协议后，可以通过write_test_protocol -output XXX.SPF命令将其输出到文件，该文件的格式是SPIL格式。&lt;br /&gt;&lt;br /&gt;二、DFT的设计规则检查&lt;br /&gt;dft_drc：对先前指定的规则检查test DRC&lt;br /&gt;&lt;br /&gt;三、对RTL test DRC的检查&lt;br /&gt;需要理解各种violation，主要的violation有三种。&lt;br /&gt;第一种是阻止扫描链的插入违例。主要的原因有：时钟不可控，latch在时钟周期开始的时候就使能，异步控制信号处于有效的状态。&lt;br /&gt;第二种是阻止采样数据的违例。主要的原因有：时钟信号作为寄存器的数据输入端，黑盒产生的信号控制时钟端或者异步控制端，源寄存器在目的寄存器获取数据之前又采样了新的数据，三态总线冲突。&lt;br /&gt;第三种就是影响fault覆盖率的违例。比如时钟作为数据，多个时钟驱动一个寄存器，以及黑盒。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-4134859426417496408?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/4134859426417496408/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=4134859426417496408' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/4134859426417496408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/4134859426417496408'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/dft-compiler-day1.html' title='DFT Compiler的学习------part1'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-1301706161215390575</id><published>2008-12-05T13:23:00.002+08:00</published><updated>2008-12-17T19:19:49.999+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_syn'/><title type='text'>关于时钟路径延时的问题</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-1301706161215390575?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/1301706161215390575/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=1301706161215390575' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1301706161215390575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/1301706161215390575'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/blog-post.html' title='关于时钟路径延时的问题'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-4476783824398125329</id><published>2008-12-02T14:56:00.006+08:00</published><updated>2008-12-03T18:50:08.558+08:00</updated><title type='text'>AEC的硬件实现1---自适应滤波算法的实现</title><content type='html'>&lt;div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;    最近工作比较轻松，闲暇之余研究下echo canceller的算法和硬件实现。 算法的核心就是基于NLMS算法的自适应滤波器。如图所示： &lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_8ua4DbBBDsg/STZUPx-qhtI/AAAAAAAAAAc/8w78dfP6VKg/s1600-h/aec.bmp"&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_8ua4DbBBDsg/STZUPx-qhtI/AAAAAAAAAAc/8w78dfP6VKg/s1600-h/aec.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5275496643602056914" style="margin: 0px 10px 10px 0px; float: left; width: 317px; height: 190px;" alt="" src="http://2.bp.blogspot.com/_8ua4DbBBDsg/STZUPx-qhtI/AAAAAAAAAAc/8w78dfP6VKg/s320/aec.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;所谓自适应滤波器，就是滤波系数随着输入信号特征的变化而变化。在实现的时候采用512阶FIR的结构。由于阶数较多，采用DA算法会造成查找表的开销比较大，因此采用类似DSP的架构，将运算单元和数据单元分离的方法来实现。实现的时候需要两个512*16bit大小的RAM，一个用来对输入数据进行寄存，一个用来保存系数，完成一个乘加运算需要时钟周期三个，一个周期用来取数，一个周期用来完成乘法运算，一个周期用来完成加法运算。使用流水线的方法来减少周期消耗。 流水线如图所示：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_8ua4DbBBDsg/STZUQI3O_KI/AAAAAAAAAAk/8vf0gAFVlyc/s1600-h/asd.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5275496649744907426" style="margin: 0px 10px 10px 0px; float: left; width: 320px; height: 128px;" alt="" src="http://3.bp.blogspot.com/_8ua4DbBBDsg/STZUQI3O_KI/AAAAAAAAAAk/8vf0gAFVlyc/s320/asd.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/STZTlYnaocI/AAAAAAAAAAU/owRcF7zkV4k/s1600-h/asd.bmp"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/STZTlYnaocI/AAAAAAAAAAU/owRcF7zkV4k/s1600-h/asd.bmp"&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/STTgi5E6PcI/AAAAAAAAAAM/WTO4cbvvTrc/s1600-h/aec.bmp"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_8ua4DbBBDsg/STTgi5E6PcI/AAAAAAAAAAM/WTO4cbvvTrc/s1600-h/aec.bmp"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-4476783824398125329?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/4476783824398125329/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=4476783824398125329' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/4476783824398125329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/4476783824398125329'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/aec1.html' title='AEC的硬件实现1---自适应滤波算法的实现'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8ua4DbBBDsg/STZUPx-qhtI/AAAAAAAAAAc/8w78dfP6VKg/s72-c/aec.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5636755200589103442.post-7488480493148118687</id><published>2008-12-02T10:37:00.001+08:00</published><updated>2008-12-17T19:19:02.597+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IC_syn'/><title type='text'>set_max_delay的使用总结</title><content type='html'>DC在逻辑综合的时候，对于时序约束，默认都是基于单cycle的方法。set_max_delay可以对时序路径的延时设定一个特定的值进行直观的约束，这个值可以大于一个cycle，所以说set_max_delay设定的路径就属于一个时序例外(timing exception)，对于这类路径可以通过report_timing_requirement来报告出来。在使用set_max_delay的时候，尤其需要注意的是约束的对象一定要是一条合法的时序路径，所谓合法的路径，就是startpoint和endpoint都必须合法，如果约束的对象只是一条合法时序路径的一个部分，那么将会创建出新的startpoint和endpoint，由于这些新的startpoint和endpoint都没有其他的约束路径，因此会忽略该部分路径，导致分析的错误。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5636755200589103442-7488480493148118687?l=chipdesigns.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chipdesigns.blogspot.com/feeds/7488480493148118687/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5636755200589103442&amp;postID=7488480493148118687' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7488480493148118687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5636755200589103442/posts/default/7488480493148118687'/><link rel='alternate' type='text/html' href='http://chipdesigns.blogspot.com/2008/12/setmaxdelay.html' title='set_max_delay的使用总结'/><author><name>chipdesigns</name><uri>http://www.blogger.com/profile/00616362299139000134</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
