这不是我要解决的障碍,只是寻找一种可能更优雅的方法。
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个输入的情况下,在单独的assign语句中执行此操作,但让我们想象一下,多路复用器有更多输入,对于更多输入,使用多个if / else或a据我所知,我不能与Assign一起使用的案例声明。
现在我有一个问题,我必须在always
块中对LHS进行注册,尽管在这种情况下它是组合逻辑,在这种情况下它不会推断出寄存器。
但是,如果我将CMD
更改为reg
,则无法使用{}表示法来组合CAS
,RAS
和WE
。
我可以用任务替换CMD
或在模块外部组合/拆分CAS
,RAS
和WE
并将它们作为单个CMD
模块参数。
有什么更优雅的表达方式?
答案 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_comb
和always @(*)
上使用logic
,在wire
和reg
上使用.nav {
display: flex;
flex-wrap:wrap;
}
.nav-child {
min-width:200px;
flex:1;
margin:0.125em;
text-align: center;
border: 1px solid black;
}
你似乎是。