我知道在使用report
和severity
时,Modelsim会将模拟时刻显示为其向控制台发送消息的一部分。无论如何,这个时刻作为一个字符串变量“得到”,所以我可以用这个“时间”字符串打印我自己的消息吗?
答案 0 :(得分:11)
模拟时间可通过now
函数获得,该函数将返回值time
类型。 image
类型的time
属性可用于将其转换为time'image(now)
的字符串。因此,您可以使用以下命令在自己的消息中打印模拟时间:
report "This is the time: " & time'image(now);
添加:如果需要额外的字符串操作,则模拟时间字符串可以用变量表示,代码如下:
process is
variable sim_time_str_v : string(1 to 30); -- 30 chars should be enough
variable sim_time_len_v : natural;
begin
...
sim_time_len_v := time'image(now)'length;
sim_time_str_v := (others => ' ');
sim_time_str_v(1 to sim_time_len_v) := time'image(now);
report "Sim time string length: " & integer'image(sim_time_len_v);
report "Sim time string.......:'" & sim_time_str_v & "'";
...
然而,VHDL在文本字符串操作方面很麻烦,因为存储某些操作的结果需要知道长度。对于更高级的字符串操作,可以在模拟中使用access
类型与函数的组合。
答案 1 :(得分:0)
首先阅读@MortenZdk帖子。这是格式化的长评论。
我建议使用VHDL-2008 to_string函数,而不是使用'image。您可以结合文件的内置写操作使用它:
write(OUTPUT, "This is the time: " & to_string(now) & LF) ;
或者,您也可以将它与textio一起使用,它将消除文字字符串值的歧义。例如,以下不需要类型限定符:
write(write_buf, "The time is:" & to_string(now)) ;
writeline(OUTPUT, write_buf) ;
如果你真的讨厌textio,你可以使用连接和to_string,就像在其他语言的print语句中使用“,”一样。不要忘记最后的LF字符来结束这一行。您还可以在其他位置添加LF字符以打印多行。
write(OUTPUT, "%%ERROR: RX value does not match expected value" &
"Received Value: " & to_hstring(RxVal) &
" Expected Value: " & to_hstring(ExpectedVal) &
" at time: " & to_string(now) & LF ) ;
to_string支持图像支持的超集。最值得注意的是数组值(例如std_logic_vector)。它是可重载的,但已经支持VHDL-2008中textio支持的所有类型。它还支持以to_hstring和to_ostring形式的十六进制和八进制重载(就像hwrite和owrite一样)。请注意,VHDL-2008删除了hwrite,owrite,hread和oread的问题。
作为访问类型的替代方法,VHDL-2008还具有返回值和长度的字符串读取。它会跳过空格,然后读取字符(最多为字符串变量的长度),直到找到空格。以下示例允许字符串标记最多为80个字符。
variable ReadVal : string(1 to 80) ;
variable ReadLen : integer ;
...
sread(ReadBuf, ReadVal, ReadLen) ;