2015-08-26 3 views
0

Можно ли использовать цикл $ writememh in for? Я также пытаюсь записать файл из разных воспоминаний. И я получаю предупреждение: "Warning: More indices than needed".

У меня есть googled, но об этом предупреждении ничего не написано. Ниже приведен пример кода:

reg [7:0] Mem_x[1023:0]; 
reg [7:0] Mem_y[1023:0]; 
reg [7:0] Mem_z[1023:0]; 
reg [31:0] image[1023:0]; 

initial 
begin 

#1000 
for (l = 0; l < 25; l = l + 1) 

    @(posedge Clock) 
    begin 
     $writememh ("writefile_out.hex",Mem_x[l]); 
     $writememh("writefile_out.hex",Mem_y[l]); 
     $writememh("writefile_out.hex",Mem_z[l]); 
     $writememh("writefile_out.hex",image[l][7:0]); 
    end 
end 
+1

Можете ли вы добавить свое определение 'Mem_x' и' image', спасибо. – Morgan

+0

Привет, Морган, я добавил определения всех воспоминаний. – ssgr

ответ

1

Я полагаю, Mem_x, Mem_y, Mem_z и image объявлены что-то вроде:

integer Mem_x[0:24]; 
integer Mem_y[0:24]; 
integer Mem_z[0:24]; 
reg [7:0] image[0:24]; 

В этом случае вы хотите файл, который читает что-то вроде:

{Mem_x[0]} 
{Mem_y[0]} 
{Mem_z[0]} 
{image[0]} 
{Mem_x[1]} 
{Mem_y[1]} 
{Mem_z[1]} 
{image[1]} 
{Mem_x[2]} 
... 

Где указано каждый из шестнадцатеричных значений для указанной переменной.

Если это так, вы не можете использовать $writememh для достижения этой цели; потому что $writememh перезаписывает данный файл, он НЕ добавляет к нему. Таким образом, при каждом вызове вы удаляете предыдущее содержимое «writefile_out.hex». Кроме того, причина, по которой вы получаете эту ошибку, связана с тем, что Mem_x[l] и другие не являются массивами, они являются элементами массивов, а $writememh ожидает массив как аргумент (при этом слишком много ошибок индексов).

Однако вы можете использовать $fdisplay для достижения того, чего хотите (а затем и некоторых). Вот пример:

integer outfile; 
integer i; 
reg [7:0] mem1[0:9]; 
reg [7:0] mem2[0:9]; 

initial begin 
    outfile = $fopen("out.hex"); 
    ... 
    for (i = 0; i < 10; i = i + 1) begin 
    $fdisplay(outfile, "%02x\n%02x\n", mem1[i], mem2[i]); 
    end 
    ... 
end 

Использование $fdisplay означает, что вы можете форматировать вывод, как вам нравится, поэтому оно не должно быть ограничено в стандартном формате шестигранной используется $readmemh и $writememh, если вы не хотите, чтобы это было, то вам просто используйте что-то вроде выше.

+0

О! Я получил его :) В любом случае я сохранил все небольшие воспоминания в финальной большой памяти, а затем дал его в качестве аргумента в $ writememh, и он сработал. Большое спасибо @Unn :) – ssgr