请说明此代码的工作原理...
module top;
//string mem [5];
real mem [5];
initial begin
$sreadmemh(mem,2,3,"A","B");
$display("mem = %p",mem);
end
endmodule
答案 0 :(得分:1)
正如您正确发现的那样,$sreadmemh
和$sreadmemb
都在IEEE 1800-2009中被定义为可选系统任务(可能在IEEE 1800-2005中,我没有很容易地对其进行检查)。它们基本上是对传统$readmemh
和$readmemb
的补充,采用字符串参数代替文件名。
从LRM(D.14):
$sreadmemb ( mem_name , start_address , finish_address , string { , string } ) ;
$sreadmemh ( mem_name , start_address , finish_address , string { , string } )
系统任务
$sreadmemb
和$sreadmemh
从字符串将数据加载到内存mem_name
中。的输入文件中出现的字符串的格式相同。
$sreadmemh
和$sreadmemb
系统任务将内存数据值和地址作为字符串文字 论点。起始地址和结束地址指示将存储字符串数据的范围 在内存中。这些字符串与作为参数传递给$readmemb
和$readmemh
基本上,如果受支持,它们可以像$readmemh
或$readmemb
那样使用,它们没有文件(因此没有filename参数),但是您可以将文件内容直接放置为一个字符串,并在初始化函数中使用它(类似于C中的fscanf
与sscanf
之类的字符串)。但是,与$readmemh
或$readmemb
不同的是,起始地址和结束地址不是可选的,您可以根据需要放置任意多个字符串参数,并且它们可以串联在一起。所以,这些都是一样的:
logic [7:0] mem[10];
...
$sreadmemh(mem, 0, 9, "AB", "BC", "12");
$sreadmemh(mem, 0, 9, "AB BC 12");
$sreadmemh(mem, 0, 9, {"AB", " BC", " 12"});
请注意,由于处理输入字符串的方式与处理$readmemh
和$readmemb
的方式相同,因此可以将值分隔为任何空格,请使用'bx
和{{1} }表示四个状态变量,并使用'bz
从特定地址开始加载。有关此格式的更多详细信息,请参见IEEE 1800-2012 21.4或其他答案:
How to initialize contents of inferred Block RAM (BRAM) in Verilog