在“总是”块中对“复合”线的组合分配

时间:2018-09-17 23:07:52

标签: system-verilog

这不是我要解决的障碍,只是寻找一种可能更优雅的方法。

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个模块RASCASWE的输出,为了方便起见,我将它们组合成一条线,以便可以为它们整体分配命令值

现在,我需要将一个多路复用器连接到CMD,为了方便起见,我将它始终放在一个块中。

在这种情况下,我可以使用三进制表达式在多路复用器只有2个输入的情况下,在单独的assign语句中执行此操作,但让我们想象一下,多路复用器有更多输入,对于更多输入,使用多个if / else或a据我所知,我不能与Assign一起使用的案例声明。

现在我有一个问题,我必须在always块中对LHS进行注册,尽管在这种情况下它是组合逻辑,在这种情况下它不会推断出寄存器。

但是,如果我将CMD更改为reg,则无法使用{}表示法来组合CASRASWE

我可以用任务替换CMD或在模块外部组合/拆分CASRASWE并将它们作为单个CMD模块参数。

有什么更优雅的表达方式?

1 个答案:

答案 0 :(得分:1)

当您要一次分配多个变量时,可以在表达式的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}即可;取决于您的风格以及对您的项目有意义的内容。附带说明,理想情况下,如果您处于SystemVerilog环境中,则最好在always_combalways @(*)上使用logic,在wirereg上使用.nav { display: flex; flex-wrap:wrap; } .nav-child { min-width:200px; flex:1; margin:0.125em; text-align: center; border: 1px solid black; }你似乎是。