Параметр 3 не является постоянным при вызове системной задачи $fwrite

Я использую Xilinx ISE 10.1 для запуска кода Verilog. В коде я хочу записать значения регистров 3 регистров в файл cipher.txt. Ниже приведен фрагмент кода:

if (clk_count==528) begin
  f1 = $fopen("cipher.txt", "w");
  $fwrite(f1, "clk: %d", clk_count[11:0]);
  $fwrite(f1, "plain: %h",  plain[31:0]);
  $fwrite(f1, "cipher: %h",  cipher[31:0]);
  $fclose(f1);
end

В конце выполнения содержимое cipher.txt находится в виде:

clk: %dplain: %hcipher: %h

Других ошибок не обнаружено, но появляется предупреждение, соответствующее трем fwrite'ам:

Parameter 3 is not constant in call of system task $fwrite.
Parameter 3 is not constant in call of system task $fwrite.
Parameter 3 is not constant in call of system task $fwrite.

Значения регистров clk_count и cipher изменяются в каждом такте (значение регистра plain остается постоянным на всем протяжении), и значения записываются в cipher.txt, когда clk_count равняется 528 (указывается оператором if).

Может ли кто-нибудь дать некоторое представление и / или помочь мне преодолеть это препятствие? Спасибо.


person zalenix    schedule 06.06.2012    source источник


Ответы (1)


Похоже, что ISE ожидает, что аргументы $fwrite будут постоянными. Предупреждения относятся к clk_count[11:0], plain[31:0], and cipher[31:0], которые не являются постоянными. По определению они меняются каждый цикл, поэтому они неизвестны во время компиляции. Это также объясняет, почему они не печатаются, и вы видите %d и %h на выходе.

Насколько мне известно, в спецификации Verilog нет ничего, что требовало бы, чтобы аргументы $fwrite были постоянными. Тот же код работает, как и ожидалось, с Cadence Incisive. Я предполагаю, что это ограничение ISE, поэтому вы можете проверить с помощью Xilinx.

Возможные обходные пути:

1) Используйте $swrite для создания строки с правильным форматированием. Затем запишите строку в файл.

2) Попробуйте использовать промежуточную переменную в вызовах $fwrite. Может быть, частичные выборки сбрасывают его. например

integer foo;
foo = clk_count[11:0];
$fwrite(... , foo , ...);

Любой из них может работать или нет.

Из любопытства, если вы удалите выбор части и попытаетесь напечатать clk_count без [11:0] , вы получите те же предупреждения?

person dwikle    schedule 06.06.2012
comment
Я работаю над Xilinx 10.1. Ни один обходной путь не работал. 1) $swrite создал еще один регистр с отформатированными данными, но $fwrite не смог распознать даже созданный новый строковый регистр. 2) пробовал и промежуточные целые числа. не сработало ни часть-выборки не несут ответственности. проверено; такие же предупреждения. - person zalenix; 07.06.2012
comment
Вы можете попробовать использовать бесплатный симулятор Icarus Verilog на основе терминала с открытым исходным кодом (iverilog.icarus.com). . Если не отлаживать проекты с кучей сигналов, я предпочитаю его ModelSim. Я не смог найти в нем недостатков, на самом деле, он помог мне найти недостатки как в ModelSim, так и в Xilinx ISE. От всей души рекомендуется! - person AVH; 07.06.2012
comment
@Darhuuk Спасибо за предложение. Я использовал Icarus Verilog для других проектов. Однако в этом конкретном проекте я работал с платой FPGA для имитации уменьшенной ISA. - person zalenix; 18.11.2013