是否可以合成带有变量的VHDL代码

时间:2014-01-25 13:38:31

标签: vhdl hdl

如果我的 VHDL 中有变量,它是否可以合成(使用 RTL 编译器等软件)?

我对此表示怀疑,因为它会立即改变其价值。我现在正在使用std_logic

2 个答案:

答案 0 :(得分:3)

正如Brian Drummond所写,你可以使用变量和变量来合成流程 网表结果取决于在赋值之前还是之后读取变量。

如果在赋值之前读取变量,则变量传输一个值 从前一次到当前时间,以及存储(通常是触发器) 或闩锁)需要随时间保持状态。示例代码,两者都有 sigvar将导致触发器,因为读取变量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过程中使用的变量是可合成的。