Verilog: задача с непрерывным назначением вывода для локальных переменных - PullRequest
0 голосов
/ 11 декабря 2018

Я ищу оператор (например, задачу / функцию), у которого есть возможность непрерывно назначать вывод (локальной переменной), а не один раз, в конце задачи.Например:

reg [7:0] out_from_task1             ;
reg [7:0] out_from_task2             ;

task automatic test   ;                                     

input  [7:0] input_task       ;
output [7:0] output_task      ;
begin 
    output_task  = 'b0                                 ;
#4  output_task = input_task                          ;
#2  output_task = input_task +2                       ;
end 
endtask

initial begin
  fork
    test(8'd10,out_from_task1)  ;
    test(8'd8,out_from_task2)  ;
  join
end

Значение, которое я получаю, является последним, тогда out_from_task1 имеет значение 12.Мне нужно увидеть сигнал out_from_task1 изменения.Первые 10, через некоторое время 12.

Могу ли я сделать это без использования глобальных переменных в Verilog?Все началось с параллельного выполнения большего количества задач в тестовом стенде.

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

В Verilog input аргументы задачи копируются по значению при входе в задачу, а output аргументы копируются при выходе из задачи.Ничто не передается через аргументы, пока задача занимает время.SystemVerilog добавляет ref направление аргумента, которое означает, что аргумент передается как ссылка.Это позволяет видеть активность с аргументом, пока задача активна:

task test(input [7:0] input_task, ref logic [7:0] output_task);
0 голосов
/ 02 августа 2019

Я не вижу ответа от оригинального постера.Однако предлагаемое решение не работает для меня.По крайней мере, с каденцией резаным v15.20.out_from_task1/2 никогда не приводятся.

Должна ли это быть хорошо поддерживаемая функция?

module tb();
 reg [7:0] out_from_task1;
 reg [7:0] out_from_task2;

 task automatic test;                                    
   input  [7:0] input_task;
   ref logic [7:0] output_task;
 begin 
     output_task  = 'b0;
 #4  output_task = input_task;
 #2  output_task = input_task +2;
     $display(input_task," ",output_task);
 end 
 endtask

 initial begin
   fork
     test(8'd10,out_from_task1);
     test(8'd8,out_from_task2);
   join
 end
endmodule
0 голосов
/ 11 декабря 2018

Нет, вы не можете сделать это в Verilog.«Задание» должно выполняться до конца перед назначением выходного аргумента.В результате в verilog вы можете делать это только с глобальными переменными.

Если вы хотите переключиться на системный verilog, вы можете использовать аргумент ref для задачи.Это должно работать;

task test(input [7:0] input_task, ref [7:0] output_task);
...