Как обрабатывать двунаправленный штифт (inout) в задании Verilog

Я хочу использовать двунаправленную шину данных в моем контроллере. Вот код

module controller ( clk, data_out);
// Port Declaration
input   clk;
inout   [7:0] data_out;

reg     [7:0] a;
reg     [7:0] b;
wire    [7:0] c;

// data should write to data_out (data_out act as output)

task write; 
input c;
begin

assign data_out = a;
data_out <= c;

end
endtask

// data should read from data_out (data_out act as input)

task read; 
output b;
begin

assign data_out = 8'bz;
b <= data_out;

end
endtask

endmodule

когда я компилирую это, я получаю сообщение об ошибке

LHS в процедурном непрерывном назначении не может быть net: data_out.

он говорит, что есть ошибка в assign data_out = a; а также assign data_out = 8'bz; Я знаю, что назначение должно быть сделано всегда или в начальном блоке, но в задаче, использующей эти блоки, бесполезны / дают эру

Тогда, как мы можем изменить направление автобуса в сторону задачи?

1 ответ

Решение

Вы не должны использовать assign в начальных и всегда блоках. Я не понимаю, почему вы обязательно хотите это в задании? Просто используйте назначить в одиночку. При присвоении значения двунаправленному порту необходим флаг, который указывает, какие действия - чтение или запись - должны быть выполнены. Синтаксис похож на:

  assign bidir_port = [flag] ? a : 1'bz;
Другие вопросы по тегам