[使用条件运算时出现错误

问题描述 投票:0回答:2

我已经使用条件运算符写了一行,如下所示:

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;
  1. RS2和RS1是32位输出线。
  2. Rn和Rm是32位输入。
  3. rs1和rs2是32位寄存器。
  4. RdEn是2位寄存器。
  5. DisI和开关是一位寄存器。

enter image description here

模拟器(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
verilog system-verilog hdl
2个回答
2
投票

编译器将?中的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位也是一种好习惯。


1
投票

尽管您已经获得了可接受的答案,但我强烈建议您重新分配作业。照原样,很难阅读,因此很难调试。至少要添加返回线并缩进,以便在视觉上易于配对。例如,以下是toolic解决方案的副本,其中添加了换行符和空格。请注意,这种格式样式不会发生RdEn==2'b00?问题。像emacs和vim这样的编辑器都有语法插件,可以帮助缩排格式。

© www.soinside.com 2019 - 2024. All rights reserved.