gpt4 book ai didi

vhdl - 使用非静态信号名称进行循环中的过程调用

转载 作者:行者123 更新时间:2023-12-02 08:23:36 24 4
gpt4 key购买 nike

在一些测试台代码中,我使用一个过程来对信号执行某些操作。然后,我对不同的信号按顺序多次使用此过程。只要我明确定义信号,这就可以正常工作;一旦我在循环中索引信号,它就会失败

(vcom-1450) Actual (indexed name) for formal "s" is not a static signal name.

为什么这是不可能的?我该如何解决它?也许我可以将其移至 for ...generate,但随后我希望以明确定义的顺序调用 do_something

library ieee;
use ieee.std_logic_1164.all;

entity test is
end test;

architecture tb of test is
signal foo : std_logic_vector(1 downto 0);
begin
dummy: process is
procedure do_something (
signal s : out std_logic
) is begin
s <= '1';
report "tic";
wait for 1 ns;
-- actually we would do something more interesting here
s <= '0';
report "toc";
end procedure;
begin
-- This works well, but requires manual loop-unrolling
do_something(foo(0));
do_something(foo(1));

-- This should do the same
for i in foo'range loop
-- This is the offending line:
do_something(foo(i));
end loop;
wait; -- for ever
end process dummy;
end architecture tb;

我正在使用 ModelSim 10.4 PE。

最佳答案

有趣的是,如果 foo 是进程的本地变量,(并且 s 进行了调整以适应)ghdl 会编译它。这突出了原始版本中的问题。 “for”循环需要一直驱动整个 foo ,因为你不能让信号驱动器随意出现或消失 - 它不能对它驱动的位产生矛盾,(正如您所看到的,该过程尝试在不同时间驱动不同的位)。

因此,如果您可以重新调整应用程序以允许变量更新语义,并使 foo 成为进程的本地变量,那就可以了。 (如果您想看到效果,则必须在每次“等待”之前将其值复制到信号中!)

或者,将整个 foo 信号和索引传递给子程序,以便后者始终驱动所有 foo ,如下所示...(我还添加了缺失的位并修复了虚假的并发“等待”:将来,请在发布之前检查您的代码示例是否实际编译!)

library ieee;
use ieee.std_logic_1164.all;

entity test is
end test;

architecture tb of test is
signal foo : std_logic_vector(1 downto 0);
begin
dummy: process is
procedure do_something (
signal s : out std_logic_vector(1 downto 0);
constant i : in natural
) is begin
s <= (others => '0');
s(i) <= '1';
report "tic";
wait for 1 ns;
-- actually we would do something more interesting here
s(i) <= '0';
report "toc";
end procedure;

begin
-- This works well, but requires manual loop-unrolling
do_something(foo,0);
do_something(foo,1);

-- This should do the same
for i in foo'range loop
-- This is the offending line:
do_something(foo,i);
end loop;
wait; -- for ever
end process dummy;

end architecture tb;

关于vhdl - 使用非静态信号名称进行循环中的过程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31044965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com