Vhdl 来自试验台的力信号

Vhdl 来自试验台的力信号,vhdl,modelsim,Vhdl,Modelsim,问题 在我的设计中,有一个用于延迟的计数器。出于模拟的目的,我想在不编辑任何生产代码的情况下限制它的最大值。这样做是为了加速模拟 我尝试过的 我想检查它是否超过了测试台的最大值,如果超过了,我想将它设置为该值。我的第一次尝试是这样的: alias ext_delay is << signal .architecture.in.my.production.code.delay : std_logic_vector(31 downto 0) >>; cap_delay : p

问题

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

我尝试过的

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

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;
别名外部延迟为>;
cap_延迟:进程(ext_延迟)为
常量最大值:标准逻辑向量(31到0):=x“00001000”
开始
如果外部延迟>最大值,则

ext_delay您是否使用了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;
别名外部延迟为>;
cap_延迟:过程正在进行中
常量最大值:标准逻辑向量(31到0):=x“00001000”
开始
等待外部延迟>最大值,然后

ext_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;
signal Counter_us:UNSIGNED(23到0):=(others=>'0');
[...]
进程(时钟)
常数计数器_MAX:正:=ite(模拟,10010000);
开始
如果上升沿(时钟),则
如果(Counter_us>=Counter_MAX),则
计数器_us“0”);
其他的

计数器\u us您是否尝试使用
释放
来“撤消”您的
强制
?例如,我知道,但我不知道我该如何计算时间。我不能做
ext\u delay也许你可以用你使用
force
的代码更新这个问题,只是作业行被更改为
ext\u delay测试设计应该是你开发过程的一部分。将不充分的代码视为黄金,并不能帮助您改进任何东西。更好的解决方案是使用顶级泛型来控制延迟,或者使用可配置的寄存器文件来修改行为。使用强制信号进行黑客攻击是一个糟糕的解决方案。它应该只用于调试,而不是验证。是的,首先尝试从波形右键单击>noforcenoforce使用它是modelsim命令,VHDL关键字是
release
。我知道这一点,但我不知道该如何计时。您可以在测试台中使用变量,我没有尝试过使用变量来处理信号,但我使用变量来处理文件是的,但正如我所说的,我不想编辑任何生产代码,因为这需要重新认证已经在发布分支上的部分代码。我发布了我使用的解决方案。这应该是
等到
然后
在第5行,与
相同,等待10 ns行。@mbschenkel,这是可能的,现在无法验证。