0

请解释一下这段代码是如何工作的......

module top;
    //string mem [5];        
    real mem [5];            
    initial begin
        $sreadmemh(mem,2,3,"A","B");
        $display("mem = %p",mem);
    end 
endmodule
4

1 回答 1

2

正如您正确发现的那样,$sreadmemh并且$sreadmemb都被定义为 IEEE 1800-2009 中的可选系统任务(可能在 IEEE 1800-2005 中,我没有那么容易检查)。它们基本上作为传统$readmemhand的补充$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没有文件的地方使用(因此没有文件名参数),但是您可以将文件的内容直接作为字符串放置,并在初始化函数中使用它(有点像fscanfsscanfC 中的对比)。但是,与$readmemhor不同的是$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可以用任何空格分隔值,对四个状态变量使用'bxand ,并使用开始在特定地址加载。有关此格式的更多详细信息,请参见 IEEE 1800-2012 21.4 或其他答案: How to initialize contents of inferred Block RAM (BRAM) in Verilog'bz@addr

于 2018-08-06T21:56:59.697 回答