我已经使用条件运算符写了一行,如下所示:
assign {RS2, RS1} = (!DisM || !DisX)? (RdEn==2'b00? (!DisI? {rs2, rs1} : 64'bz) : (RdEn==2'b01? (!switch? {rs2, Rn} : {Rn, rs1}) : {Rm, Rn}))) : 64'bz;
模拟器(Icarus 0.9.7或任何版本)显示在上一行中存在语法错误。
这是我的代码,可以解决相同的问题:
module TEST(Rn, Rm, DisM, DisX, DisI, switch, RdEn, RS1, RS2);
input [31:0]Rn, Rm;
input DisM, DisX, DisI, switch;
input [1:0]RdEn;
output [31:0]RS1, RS2;
reg [31:0]rs1, rs2;
always@*
begin
rs1 = Rn + 32'd7;
rs2 = Rm - 32'd7;
end
assign {RS2, RS1} = (!DisM || !DisX)? (RdEn==2'b00? (!DisI? {rs2, rs1} : {64{1'bz}}) : (RdEn==2'b01? (!switch? {rs2, Rn} : {Rn, rs1}) : {Rm, Rn}))) : {64{1'bz}};
endmodule
编译器将?
中的RdEn==2'b00?
解释为第三位,而不是三元运算符。只需在b00
和?
之间添加一个空格即可。与b01?
相同。
?
是有效的z_digit。请参阅IEEE Std 1800-2012,第5.7节“数字”。
而且,括号的数量不匹配(好的编辑器可以显示此内容:]]
assign {RS2, RS1} = (!DisM || !DisX)? (RdEn==2'b00 ? (!DisI? {rs2, rs1} : {64{1'bz}}) : (RdEn==2'b01 ? (!switch? {rs2, Rn} : {Rn, rs1}) : {Rm, Rn})) : {64{1'bz}};
使用
{64{1'bz}}
确保获得1'bz
的64位也是一种好习惯。
尽管您已经获得了可接受的答案,但我强烈建议您重新分配作业。照原样,很难阅读,因此很难调试。至少要添加返回线并缩进,以便在视觉上易于配对。例如,以下是toolic解决方案的副本,其中添加了换行符和空格。请注意,这种格式样式不会发生RdEn==2'b00?
问题。像emacs和vim这样的编辑器都有语法插件,可以帮助缩排格式。