原谅一个新手,我甚至不知道如何正确地提出这个问题:
我有一个当前加载到内存库的文件,我想将它分成四个不同的内存库。
我有一些系统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不会让我做这类事情。
任何人都可以想出一个能够达到同样效果的整洁结构吗?
答案 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