Комбинаторное присваивание «составного» провода в всегда блоке - PullRequest
0 голосов
/ 18 сентября 2018

Это не тот блокатор, с которым я имею дело, просто ищу, возможно, более элегантный способ сделать это.

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 модуля.

Есть более элегантный способ выразить это?

1 Ответ

0 голосов
/ 18 сентября 2018

Если у вас есть несколько переменных, которые вы хотите назначить одновременно, вы можете использовать оператор конкатенации в LHS выражения:

output logic CAS, RAS, WE;
...
logic [2:0] CMD;

assign {CAS, RAS, WE} = CMD;
...
CMD = 3'b011; // Will assign CAS = 0, RAS = 1, WE = 1
...

Вы также можете просто не использовать CMD ввсе и просто используйте {CAS, RAS, WE} на своем месте;в зависимости от вашего стиля и того, что имеет смысл для вашего проекта.Примечание: в идеале вы должны использовать always_comb над always @(*) и logic над wire и reg (в основном), если вы находитесь в среде SystemVerilog, как вам кажется.

...