verilog - 谁能解释 SystemVerilog 中“$sreadmemh”的用法?我在任何地方都没有得到明确的解释
问题描述
请解释一下这段代码是如何工作的......
module top;
//string mem [5];
real mem [5];
initial begin
$sreadmemh(mem,2,3,"A","B");
$display("mem = %p",mem);
end
endmodule
解决方案
正如您正确发现的那样,$sreadmemh
并且$sreadmemb
都被定义为 IEEE 1800-2009 中的可选系统任务(可能在 IEEE 1800-2005 中,我没有那么容易检查)。它们基本上作为传统$readmemh
and的补充$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
没有文件的地方使用(因此没有文件名参数),但是您可以将文件的内容直接作为字符串放置,并在初始化函数中使用它(有点像fscanf
与sscanf
C 中的对比)。但是,与$readmemh
or不同的是$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"});
请注意,由于输入字符串的处理方式与 for 相同,因此$readmemh
您$readmemb
可以用任何空格分隔值,对四个状态变量使用'bx
and ,并使用开始在特定地址加载。有关此格式的更多详细信息,请参见 IEEE 1800-2012 21.4 或其他答案:
How to initialize contents of inferred Block RAM (BRAM) in Verilog'bz
@addr
推荐阅读
- http - 来自 AWS Lambda 和 Rust 的 reqwest 分段错误
- php - 我需要帮助来查找我的电报重定向中的错误
- python - 'mypy' 由于循环依赖而失败
- python - 值不会从 Python 中的子级传播到父级方法
- reactjs - React Native“TypeError:无法在'Window'上执行'fetch':使用GET / HEAD方法的请求不能有正文。”
- java - While 的时间复杂度与另一个类的函数调用
- javascript - 使用 React 钩子处理 graphQL 突变错误(useMutation + Apollo-client)
- ajax - 使用 laravel 6 和 ajax 从空值创建默认对象
- laravel - Laravel - 403 重定向。重定向适用于标签和类别部分,但不适用于用户
- php - 如果变量没有值 laravel php,则从数组中删除索引