我正在尝试模拟以下代码:
entity schal is port ( SW : in bit_vector(7 downto 0);
LED : out bit_vector(7 downto 0));
end schal;
architecture BEHAVIOUR of schal is
begin
INOUT_PROS : process (SW)
begin
LED <= SW;
end process INOUT_PROS;
end BEHAVIOUR;
我写了 do file
vsim work.schal
restart
view wave
radix hex
add wave -height 25 -radix default sim:/schal/*
force SW 01000001
run 20ns
force SW 01000000
run 20ns
这是我得到的:
你可以看到模拟仅影响第一位但不影响整个矢量? 任何想法我应该如何调整做文件来获得正确的模拟?
答案 0 :(得分:2)
我认为您的force
命令没有使用正确的语法。您正试图强制使用二进制值,但正确的方法是force SW 2#01000001
,2#
指定二进制值。
在ModelSim中,转到帮助&gt;文档&gt; PDF书架,然后打开“命令参考手册”。其中包含有关所有命令的文档,包括force
。
答案 1 :(得分:1)
这是一个Read-The-Fine-Manual时刻。请参阅&lt; value&gt; “命令参考手册”中“强制命令参数”部分下的参数说明。
字符枚举的一维数组可以强制为字符文字序列,也可以强制为基数为2,8,10或16的基数。例如,以下值对于类型的信号是等效的bit_vector(0到3):
您可以注意到IEEE Std 1076-2008 15.5.3基础文字告诉我们:
基于文字的是以明确指定基础的形式表示的抽象文字。基数应至少为2,最多为16。
有基于VHDL标准的文字,无法用force命令表示。
还要注意问题的使用
force SW 01000001
与“命令参考手册”中的 字符文字序列 示例兼容。请参阅以下注意:
对于VHDL中的基础数字,ModelSim将每个1或0转换为数字枚举类型的适当值。转换由pref.tcl文件中的转换表控制。如果ModelSim找不到0或1的转换,它将使用信号类型的左边界(type'left)作为该值。
还要从问题的值和波形中注意SW
枚举的最右侧位置正确转换。这表明该行为与force命令&lt; value&gt;不匹配。描述。
在VHDL术语中,您正在强制使用scary_jeff的答案中演示的位字符串文字,而不是用于提供值的字符串文字。 (均为无引号)。
根据示例,字符文字序列是正确的,但不能正确翻译。您可能想知道引号是否会有所帮助 - 否则将如何强制包含前导空格的字符串类型对象的值?
作为早期的MTI Modelsim用户,模拟器最初只支持VHDL。问题是模拟器或示例。
当然,使用VHDL测试平台而不是在do文件中嵌入模拟序列。
此方法可在VHDL模拟器之间移植:
entity schal_tb is
end entity;
architecture foo of schal_tb is
signal SW: bit_vector(7 downto 0);
signal LED: bit_vector(7 downto 0);
begin
DUT:
entity work.schal
port map (
SW => SW,
LED => LED
);
STIMULUS:
process
begin
SW <= "01000001";
wait for 20 ns;
SW <= "01000000";
wait for 20 ns;
wait for 60 ns; -- to show 100 ns on waveform
wait; -- suspends process permenently
end process;
end architecture;
并给出:
还有在线VHDL Testbench大纲生成器,例如Doulos VHDL Testbench generator或此Online VHDL Testbench Template Generator。