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=’
q<=b; --没有else语句
end if;
end process lat_proc;
较差的代码风格(case语句):会有锁存器发生
lat_proc:process(c)
begin
case c is
when ‘
z<=’
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<=’
bus_int<=’
case state ……
……
end process comb_proc;
较差的代码风格:
lat_proc:process(g,a,b)
begin
if (g=’
q<=’
elsif (a=’
q=b;
end if;
end process lat_proc;
建议的代码风格:
lat_proc:process(g1,g2,a,b)
begin
q<=’
if (g1=’
q<=a;
elsif (g2=’
q<=b;
end if;
end process lat_proc;
较差的代码风格:
mux_proc:process(decode,A,B)
begin
if (decode=’
C<=A;
elsif (decode=‘
C<=B;
end if;
end process mux_proc;
建议的代码风格:
mux_proc:process(decode,A,B)
begin
if (decode=’
C<=A;
else
C<=B;
end if;
end process mux_proc;
之前介绍了如何避免锁存器的发生的代码风格,接下来利用一个简单的范例说明
例:
process(enable,data)
begin
if enable=’
Q<=data; --没有else语句
end if;
end process;
〔PS〕:如果不想让锁存器发生,在Design Compiler中可以设hdlin_check_no_
latch=ture,综合器产生锁存器则会发生警告。
l 避免锁存器的范例之一:
process(enable,data_in)
begin
if eneble=’
data_out<=data_in;
else
data_out<=’
end if;
end process;
l 避免锁存器的范例之二:
process(enable,data_in)
begin
data_out<=’
if eneble=’
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<=’
out_2<=’
out_3<=’
out_4<=’
case data_in is
when 0 => out_1 <= ‘
when 1 | 3 => out_2 <= ‘
when 4 to 7 | 2 => out_3 <= ‘
when others => out_4 <= ‘
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)=’
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)=’
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=>’
for k in 7 downto 0 loop
next when copy_enable(k)=’
data_out(k)<=data_in(k);
end loop;
end process;
TAG: 研发心得