来自测试平台的强制信号

时间:2015-02-25 10:24:07

标签: vhdl modelsim

问题

在我的设计中,有一个用于延迟的计数器。出于模拟目的,我想在编辑任何生产代码时限制它的最大值。这样做是为了加速模拟。

我尝试了什么

我想检查它是否超过了我的测试平台的最大值,如果是,我想将它设置为该值。我的第一次尝试看起来像这样:

alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>;
cap_delay : process (ext_delay) is
    constant max_value : std_logic_vector(31 downto 0) := x"00001000"
begin
    if ext_delay > max_value then
        ext_delay <= max_value;
    end if:
end process cap_delay;

但是,这会导致架构中的延迟信号始终为'U',可能是因为它是由多个进程驱动的。然后我使用force关键字尝试了它,它成功地更改了值并且没有使它成为'U',但是我需要一种方法在下次递减时再次释放它。

3 个答案:

答案 0 :(得分:2)

我已经弄清楚了。通过更改为基于等待的过程,我可以轻松地使用时间延迟。我使用的完整解决方案如下所示:

alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>;
cap_delay : process is
    constant max_value : std_logic_vector(31 downto 0) := x"00001000"
begin
    wait until ext_delay > max_value then
        ext_delay <= force max_value;
    wait for 10 ns;
        ext_delay <= release;
end process cap_delay;

答案 1 :(得分:1)

有一种方法可以确定您的VHDL代码是在模拟中执行还是用于合成。此代码可以封装在一个函数中,因此您可以在VHDL代码中进行检查。例如,您可以为计数器定义不同的最大值。

function SIMULATION return boolean is
  variable ret : boolean;
begin
  ret := false;
  --synthesis translate_off
  if Is_X('X') then ret := true; end if;
  --synthesis translate_on
  return  ret;
end function;

除此之外,if-then-else函数有助于在常量声明中选择不同的值:

function ite(cond : BOOLEAN; value1 : INTEGER; value2 : INTEGER) return INTEGER is
begin
  if cond then
    return value1;
  else
    return value2;
  end if;
end function;

示例计数器:

signal Counter_us : UNSIGNED(23 downto 0) := (others => '0');

[...]

process(Clock)
  constant COUNTER_MAX : POSITIVE := ite(SIMULATION, 100, 10000);
begin
  if rising_edge(Clock) then
    if (Counter_us >= COUNTER_MAX) then
      Counter_us <= (others => '0');
    else
      Counter_us <= Counter_us + 1;
    end if;
  end if;
end process;

对于像SIMULATION和ite(..)这样的更多功能,请查看PoC.utils包。

答案 2 :(得分:-1)

您使用过 Noforce 关键字, 它释放信号的值