我想描述一个可以正常运行或被置于测试模式的实体。我的一般设计是包含“真实”实体和测试实体的顶级实体。
我试图找出用VHDL表达这个的最好方法,但我觉得我过于复杂了。
考虑一个小的顶级实体(实际上,还有更多的I / O):
entity toplevelobject is
port (
in1 : inout std_logic;
in2 : inout std_logic;
out1 : out std_logic;
out2 : out std_logic;
testline : in std_logic;
testclk : in std_logic;
);
end toplevelobject;
根据“testline”的状态(高均值测试),应该在实际功能和测试模式之间切换。请注意,测试模块实际上使用除clk
之外的所有内容作为输出,甚至是in_*
。
architecture test_passthrough of toplevelobject is
-- This is the actual module
component real_module
port (
in1 : in std_logic;
in2 : in std_logic;
out1 : out std_logic;
out2 : out std_logic;
clk : in std_logic;
-- Note absence of "testline"
);
end component;
-- This is the test module, which will just put the clk
-- signal out on all pins, or play a tune, or something
component test_module
port (
in1 : out std_logic;
in2 : out std_logic;
out1 : out std_logic;
out2 : out std_logic;
testclk : in std_logic;
-- Note absence of "testline"
);
end component;
signal real_in1, real_in2 : std_logic;
signal real_out1, real_out2 : std_logic;
signal test_in1, test_in2 : std_logic;
signal test_out1, test_out2 : std_logic;
begin
real_0 : real_module port map (
in1 => real_in1,
in2 => real_in2,
out1 => real_out1,
out2 => real_out2,
clk => clk,
);
test_0 : test_module port map (
in1 => test_in1,
in2 => test_in2,
out1 => test_out1,
out2 => test_out2,
testclk => clk,
);
-- Ports that are outputs on both don't need
-- much special attention
out1 <= real_out1 when testline = '0' else test_out1;
out2 <= real_out2 when testline = '0' else test_out2;
end test_passthrough;
所以我有几个问题:
对于inout
个端口,我是否应该使用case ... when
语句打开testline
?或者使用if
语句的每个I / O的进程?从理论上讲,我认为许多较小的进程是同时执行而不是顺序执行,但它实际上会对仿真或综合产生影响吗?例如:
passthrough_in1 : process(testline, in1, test_in1) is
begin
if testline = '0' then
real_in1 <= in1;
else
in1 <= test_in1;
end if;
end process passthrough_in1;
... ... VS
passthrough_all : process(in1, test_in1, in2, test_in2, testline) is
case testline is
when '0' =>
real_in1 <= in1;
real_in2 <= in2;
when '1' =>
in1 <= test_in1;
in2 <= test_in2;
end case;
end process passthrough_all;
passthrough_in1
(甚至passthrough_all
对testline
以外的任何其他内容敏感?real_in1
/ test_in1
在两个包装实体之间进行选择?或者是否有其他方式可以说“如果testline
为高,请将test_module
输出in_1
连接到toplevelobject
I / O in_1
?答案 0 :(得分:1)
如果我理解你的正确你的testmodule驱动(名称错误 - 我假设在实际代码中他们更有意义:) in1,2端口?
如果是这样,你需要做这样的事情:
real_in1 <= in1;
in1 <= test_in1 when testline = '1' else 'Z';
在非测试模式下,in1信号将由'Z'驱动,因此外部正确的in1信号可以覆盖它。
您可以通过各种其他方式(如您描述的过程)来表示这一点,所有这些都应该在模拟器中相同。 “一体化过程”选项的缺点是,您需要保留最终可能最终作为一个巨大的敏感性列表的内容。每个信号执行一个过程只是我上面所做的一个漫长的方式。
要保存一些代码并复制/粘贴工作,您可能会将这两行代码推送到自己的实体中,然后多次实例化 - 在这种情况下,我将实例和端口映射全部放在一行,但这会冒犯一些编码标准......
这一切都假设我已正确理解问题了!
答案 1 :(得分:0)
也许我不完全理解你要做的是什么,但是在典型的VHDL测试平台中:
您使用的是什么软件?如果对你有任何帮助,我可以在几年前从大学项目中挖掘一个旧的测试平台示例。