谁能解释SystemVerilog中“ $ sreadmemh”的用法?我在任何地方都没有清楚的解释

时间:2018-08-06 07:19:17

标签: verilog system-verilog-assertions iverilog

请说明此代码的工作原理...

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

1 个答案:

答案 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中的fscanfsscanf之类的字符串)。但是,与$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