Это не тот блокатор, с которым я имею дело, просто ищу, возможно, более элегантный способ сделать это.
module Ram(RamClk, CKE, CAS, RAS, WE, DQM, BA, A, DQ,
OpEnable, Addr, RdData, WrData, Ready);
input RamClk;
output CKE;
output logic CAS, RAS, WE;
output [1:0] DQM;
output logic [1:0] BA;
output logic [11:0] A;
inout [15:0] DQ;
input OpEnable;
output [23:0] Addr; //24 bits = 16 Mb
output [15:0] RdData;
input [15:0] WrData;
output Ready;
// code omitted here
wire CMD = {CAS,RAS,WE};
// code omitted here
//multiplexers
always @*
begin
if (InitDone == 0)
begin
CMD = InitCmd;
A = InitA;
BA = InitBA;
end
else
begin
//todo: assign the output of the main CMD, A and BA multiplexers
CMD = CMD_NOP;
A = 0;
BA = 0;
end
end
//rest of the module
У меня есть 3 выхода модуля RAS
, CAS
, WE
, которые я для удобства объединяю в один провод, чтобы я мог назначить им значения команд в целом.
Теперь мне нужно подключить мультиплексор к CMD
, и я делаю это в блоке всегда для удобства.
Я мог бы сделать это в отдельных операторах присваивания в этом случае только 2 входов в мультиплексор, используя троичное выражение, но давайте представим, что мультиплексор имеет больше входов, для большего количества входов выглядит более удобным использование нескольких if / else или оператор case, который я не могу использовать с assign, насколько я понимаю.
Теперь у меня есть проблема, связанная с тем, что у меня есть регистр на LHS в блоке always
, хотя в данном случае это комбинаторная логика, и в этом случае он не выведет регистр.
Но если я изменю CMD
на reg
, тогда я не смогу использовать нотацию {} для объединения CAS
, RAS
и WE
.
Я мог бы заменить CMD
на задачу или объединить / разбить CAS
, RAS
и WE
вне модуля и сделать их одним параметром CMD
модуля.
Есть более элегантный способ выразить это?