来自测试台的力信号

Force signal from testbench

问题

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

我试过的

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

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',但是我需要一种方法在它下次递减时再次释放它。

您是否使用了 Noforce 关键字, 它释放信号值

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

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;

有一种方法可以确定您的 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 包。