首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自测试台的力信号

来自测试台的力信号
EN

Stack Overflow用户
提问于 2015-02-25 10:24:07
回答 3查看 11.4K关注 0票数 1

问题

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

我试过什么

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

代码语言:javascript
复制
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',但接下来我需要一种方法来再次释放它,下次它会减少。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-25 12:16:26

我已经想明白了。通过更改为基于等待的进程,我可以很容易地使用时间延迟。我提出的完整解决方案如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-02-25 13:14:48

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

代码语言:javascript
复制
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函数有助于在常量声明中选择不同的值:

代码语言:javascript
复制
function ite(cond : BOOLEAN; value1 : INTEGER; value2 : INTEGER) return INTEGER is
begin
  if cond then
    return value1;
  else
    return value2;
  end if;
end function;

示例计数器:

代码语言:javascript
复制
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包。

票数 1
EN

Stack Overflow用户

发布于 2015-02-25 11:21:47

您使用了Noforce关键字,它释放信号的值吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28716509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档