大连工作的硬件工程师

RTL Coding Guideline(6)-选自《VHDL芯片设计》一书

上一篇 / 下一篇  2006-07-30 14:54:48 / 天气: 晴朗 / 心情: 高兴 / 个人分类:研发心得

6.2 避免锁存器

规则:避免使用锁存器

在设计中遇到if语句或是case语句,若条件未写完全时则会产生锁存器,若使用Synosys公司出品的的Design Compiler软件的话,则可以使用all_registers_level_sensitive指令,可以列出在设计中是否会有锁存器出现。

 

锁存器发生的原因:

(1)    else语句被忽略

(2)    条件式未写完全

(3)    在时序电路中,if语句中没有’event出现

 

例:

较差的代码风格(if语句):会有锁存器发生。

lat_proc:process(a,b)

begin

  if (a=’1’) then

q<=b;  --没有else语句

  end if;

end process lat_proc;

较差的代码风格(case语句):会有锁存器发生

lat_proc:process(c)

begin

  case c is

  when ‘0’ => q<=’1’;

z<=’0’;

  end case;    --没有when others语句

end process lat_proc;

l       准则:通过以下的技术,设计者可以避免在设计中产生锁存器。

(1)    process的一开始即赋初值

(2)    对于所有的输入条件均赋值输出

(3)    使用else代替elsif

例:

comb_proc:process(state,bus_req)

begin

  --设定初始值以避免latch

bus_req<=’0’;

bus_int<=’0’;

case state ……

……

end process comb_proc;

 

较差的代码风格:

lat_proc:process(g,a,b)

begin

  if (g=’1’) then

q<=’0’;

  elsif (a=’1’) then

q=b;

  end if;

end process lat_proc;

建议的代码风格:

lat_proc:process(g1,g2,a,b)

begin

  q<=’0’;

  if (g1=’1’) then

q<=a;

  elsif (g2=’1’) then

q<=b;

  end if;

end process lat_proc;

 

较差的代码风格:

mux_proc:process(decode,A,B)

begin

  if (decode=’0’) then

C<=A;

  elsif (decode=‘1’) then

C<=B;

  end if;

end process mux_proc;

建议的代码风格:

mux_proc:process(decode,A,B)

begin

  if (decode=’0’) then

C<=A;

  else

C<=B;

  end if;

end process mux_proc;

之前介绍了如何避免锁存器的发生的代码风格,接下来利用一个简单的范例说明

例:

process(enable,data)

begin

  if enable=’1’ then

Q<=data;   --没有else语句

  end if;

end process;

PS〕:如果不想让锁存器发生,在Design Compiler中可以设hdlin_check_no_

latch=ture,综合器产生锁存器则会发生警告。

l       避免锁存器的范例之一:

process(enable,data_in)

begin

  if eneble=’1’ then

data_out<=data_in;

  else

data_out<=’0’;     --对所有的条件赋值

  end if;

end process;

 

l       避免锁存器的范例之二:

 

process(enable,data_in)

begin

data_out<=’0’;       --预先设定初始值

  if eneble=’1’ then

data_out<=data_in;

  end if;

end process;

最佳的避免锁存器的方法,则是皆不要使用条件式,如语句if或是case,这样编译的时间也最快。

process(enable,data_in)

begin

data_out<=enable and data_in;

end process;

PS〕:若条件赋值为don’t care时,则综合电路出来的均为data_out<=data_in

另外,在case语句中若没有将所有的条件写完也会产生锁存器。也可以通过一开始就设立初始值的方式来避免锁存器的产生。

例:

process(data_in)

begin

  out_1<=’0’;

  out_2<=’0’;

  out_3<=’0’;

  out_4<=’0’;

  case data_in is

when 0 => out_1 <= ‘1’;

when 1 | 3 => out_2 <= ‘1’;

when 4 to 7 | 2 => out_3 <= ‘1’;

when others => out_4 <= ‘1’;

  end case;

end process;

另外,在for loop语句也会产生锁存器,其产生的原因如下:

(1)    For loop语句中有NEXT存在,因为一遇到next语句,程序会立即跳出循环。

(2)    For loop语句之前没有默认值

例如:

process(data_in,copy_enable)

begin

  for k in 7 downto 0 loop

next when copy_enable(k)=’0’;  --copy_enable=’0’即跳出

data_out(k)<=data_in(k)

  end loop;

end process;

如果我们将上一个范例的next语句改写成if-else语句,就可以清楚的知道形成锁存器的原因了。

process(data_in,copy_enable)

begin

  for k in 7 downto 0 loop

if copy_enable(k)=’1’ then

data_out(k)<=data_in(k)

    end if;  --形成锁存的原因是没有else语句

  end loop;

end process;

只要在for loop之前加上data_out的默认值就可以避免锁存器的产生。

process(data_in,copy_enable)

begin

  data_out<=(others=>’0’);

for k in 7 downto 0 loop

next when copy_enable(k)=’0’;  --copy_enable=’0’即跳出

data_out(k)<=data_in(k)

  end loop;

end process;


TAG: 研发心得

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar