问题
在我的设计中,有一个计数器用于延迟。为了模拟目的,我想通过编辑任何生产代码来限制它的最大值。这样做是为了加速模拟。
我试过什么
我想检查它是否超过了我的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',但接下来我需要一种方法来再次释放它,下次它会减少。
发布于 2015-02-25 12:16:26
我已经想明白了。通过更改为基于等待的进程,我可以很容易地使用时间延迟。我提出的完整解决方案如下所示:
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;发布于 2015-02-25 13:14:48
有一种方法可以确定您的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;此外,如果-然后-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;获得更多类似于模拟和ite(.)的函数查看一下PoC.utils包。
发布于 2015-02-25 11:21:47
您使用了Noforce关键字,它释放信号的值吗?
https://stackoverflow.com/questions/28716509
复制相似问题