Могу ли я разделить файл на четыре части (по четырем воспоминаниям) в Verilog? - PullRequest
0 голосов
/ 24 января 2012

Простите новичка, я даже не знаю, как правильно задать этот вопрос:

У меня есть файл, который в данный момент загружен в банк памяти, и я хотел бы разделить его на четыре разных банка памяти.

У меня есть некоторый системный код 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 позволит мне делать подобные вещи.

Может кто-нибудь придумать аккуратную конструкцию, которая даст тот же результат?

1 Ответ

0 голосов
/ 24 января 2012

Кажется, этот маленький фрагмент делает бизнес. Он вносит промежуточную нагрузку, которая, я надеюсь, не будет синтезирована.

Я пойду с такими вещами. Если кто-то, кто действительно знает, что они делают, хочет сказать мне, почему это плохая идея, я был бы очень признателен.

   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
...