我可以在Verilog中将文件分成四个部分(四个存储器中)吗?

时间:2012-01-24 12:53:26

标签: file memory split verilog

原谅一个新手,我甚至不知道如何正确地提出这个问题:

我有一个当前加载到内存库的文件,我想将它分成四个不同的内存库。

我有一些系统verilog代码,它使用的行非常类似:

$readmemh(mem_file, memories.ram);

将十六进制文件(比如长度为65536字节)读入某个内存。

现在我想将内存分为四个部分,将第一季度(16384字节)放入一个块,第二季度放入另一个等等......

一个显而易见的方法是使用head,tail等分割hex文件,作为构建过程的一部分,然后在模拟时传入所有新文件名,并使用

$readmemh(mem_file_1stbit, memories.ram1);
$readmemh(mem_file_2ndbit, memories.ram2);
$readmemh(mem_file_3rdbit, memories.ram3);
$readmemh(mem_file_4thbit, memories.ram4);

但这似乎将固件构建过程,模拟脚本和verilog设计与我的口味相结合。

一个非常优秀的解决方案(在我看来),将修改verilog代码,如下所示:

$readmemh(mem_file, memories.ram1, 0,       (1<<14)-1);
$readmemh(mem_file, memories.ram2, (1<<14), (2<<14)-1);
$readmemh(mem_file, memories.ram3, (2<<14), (3<<14)-1);
$readmemh(mem_file, memories.ram4, (3<<14), (4<<14)-1);

但看起来verilog不会让我做这类事情。

任何人都可以想出一个能够达到同样效果的整洁结构吗?

1 个答案:

答案 0 :(得分:0)

这个小小的片段似乎可以做生意。它确实引入了一些中间负载的东西,我宁愿不会最终合成。

我会选择这种方式。如果有人真正知道他们在做什么想告诉我为什么这是个坏主意,我会非常感激。

   reg [8:0] data [0:15];
   reg [8:0] data1 [0:7];
   reg [8:0] data2 [0:7];

   integer   i;

   initial begin
      $readmemh("data.hex", data);
      for(i=0; i<16; i=i+1) 
        $display("%d:%h",i,data[i]);
      for(i=0; i<8; i=i+1)
        begin
           data1[i]=data[i];
           data2[i]=data[i+8];
        end
   end