2010年9月27日 星期一

encoder 小技巧....

有沒有平常被一堆的判斷式搞到昏頭轉象呢,在Verilog coding 時又要考慮到在 always block 內部的判斷是否會有 latch 產生,最後在codelink時候又擔心coverage不足夠呢... 其實簡單的想把判斷是全部展開成個encoder table,內部存著Hash key->vale 就ok 拉.不僅可以發現是否有判斷條件少了,且增加閱讀的效率... original part
          if( in_a ==1 ){ 
              out = in+1;
          } else {
              if( in_b == 0 ){
                  out = in-1;
              } else {
                  if( in_c == 1) {
                       out = in*2;
                 }else {
                       out = in;
                 }
             }
          }
encoder part
//range 0 ~ 7 
s = in_c << 2 | in_b << 1 | in_a;

switch(s){
  case  0 : out = in-1; break; // in_c(0), in_b(0), in_a(0)
  case  1 : out = in+1; break; // in_c(0), in_b(0), in_a(1)
  case  2 : out = in;   break; // in_c(0), in_b(1), in_a(0)
  case  3 : out = in+1; break; // in_c(0), in_b(1), in_a(1)
  case  4 : out = in-1; break; // in_c(1), in_b(0), in_a(0)
  case  5 : out = in+1; break; // in_c(1), in_b(0), in_a(1)
  case  6 : out = in*2; break; // in_c(1), in_b(1), in_a(0)
  case  7 : out = in+1; break; // in_c(1), in_b(1), in_a(1)
 }

沒有留言:

張貼留言