请原谅新手,我甚至不知道如何正确地问这个问题:
我有一个当前加载到内存库的文件,我想将它拆分到四个不同的内存库中。
我有一些系统verilog代码,它使用的代码行非常如下:
$readmemh(mem_file, memories.ram);将一个十六进制文件(假设它有65536字节长)读入一些内存。
现在我想将内存分成四个部分,并将第一个四分之一(16384字节)放入一个块,将第二个四分之一放入另一个块,依此类推……
一种显而易见的方法是使用head、tail等拆分十六进制文件,将其作为构建过程的一部分,然后在模拟时传入所有新文件名,并使用如下语句
$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不会让我做这类事情。
有没有人能想出一个简洁的结构来达到同样的效果呢?
发布于 2012-01-25 00:54:32
这个小片段似乎可以做这件事。它确实引入了一种中间负载的东西,我更希望这些东西最终不会被合成。
我会用这类东西。如果任何真正知道自己在做什么的人想告诉我为什么这是一个坏主意,我将非常感激。
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
endhttps://stackoverflow.com/questions/8987134
复制相似问题