Я полагаю, 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
, если вы не хотите, чтобы это было, то вам просто используйте что-то вроде выше.
Можете ли вы добавить свое определение 'Mem_x' и' image', спасибо. – Morgan
Привет, Морган, я добавил определения всех воспоминаний. – ssgr