将Modelsim模拟时间瞬间作为字符串变量?

时间:2013-08-23 02:31:37

标签: vhdl

我知道在使用reportseverity时,Modelsim会将模拟时刻显示为其向控制台发送消息的一部分。无论如何,这个时刻作为一个字符串变量“得到”,所以我可以用这个“时间”字符串打印我自己的消息吗?

2 个答案:

答案 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) ;