如果我的 VHDL 中有变量,它是否可以合成(使用 RTL 编译器等软件)?
我对此表示怀疑,因为它会立即改变其价值。我现在正在使用std_logic
。
答案 0 :(得分:3)
正如Brian Drummond所写,你可以使用变量和变量来合成流程 网表结果取决于在赋值之前还是之后读取变量。
如果在赋值之前读取变量,则变量传输一个值
从前一次到当前时间,以及存储(通常是触发器)
或闩锁)需要随时间保持状态。示例代码,两者都有
sig
和var
将导致触发器,因为读取变量var
在分配之前:
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
sig <= var;
var := arg;
end if;
end process;
如果在赋值后读取变量,则之前的任何变量值都是
未使用,因此网表中没有实施存储。因此变量是
仅用于创建中间值,例如以简化代码编写。
示例代码,其中只有sig
将导致触发器,因为变量
分配后会读取var
:
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
var := arg;
sig <= var;
end if;
end process;
在更复杂(实际)的代码中,可能难以确保变量
仅在分配后读取,因此不会推断出非预期的存储
(触发器或闩锁)。一种有用的编码风格是分配所有变量
代码开头的未知('X'
)。如果之前读取了变量
assign,这个bug通常在模拟和调试的早期就会显示出来。
示例代码:
process (clk_i) is
variable var : std_logic;
begin
if rising_edge(clk_i) then
var := `X`; -- Ensure variable assign before any use to avoid storage
var := arg;
sig <= var;
end if;
end process;
请注意,在模拟中,通常需要额外的努力来包含 波形变量;例如,ModelSim显示了a中的过程变量 单独的“当地人”视图。如果保持状态的变量被排除在外 波形然后调试要困难得多,因为波形然后 只显示故事的一半。
因此,实用的编码风格仅用于中间变量 过程中的值,因此在分配后总是进行读取。
答案 1 :(得分:1)
是的,VHDL过程中使用的变量是可合成的。