将if else语句转换为三元语句

ahe*_*ang 2 verilog

我使用ternary翻译了以下代码.但是,我知道它有问题.有人可以指出我正确的方向吗?

ForwardA = 0;
ForwardB = 0;

//EX Hazard
if (EXMEMRegWrite == 1) begin
 if (EXMEMrd != 0)
    if (EXMEMrd == IDEXrs)
        ForwardA = 2'b10;
   if (EXMEMrd == IDEXrt && IDEXTest == 0)
        ForwardB = 2'b10;
end


//MEM Hazard

if (MEMWBRegWrite == 1) begin
 if (MEMWBrd != 0) begin
    if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrs)))
            if (MEMWBrd == IDEXrs)
                ForwardA = 2'b01;
    if (IDEXTest == 0) begin
        if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrt)))
            if (MEMWBrd == IDEXrt)
                ForwardB = 2'b01;
    end
 end
end



ForwardA = (MEMWBRegWrite && MEMWBrd != 0 && (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrs))) && (MEMWBrd == IDEXrs)) ?  
                                    2'b01 : ((EXMEMRegWrite && EXMEMrd != 0 && EXMEMrd == IDEXrs) ? 2'b10 : 0);

ForwardB = (IDEXTest == 0 && MEMWBRegWrite && MEMWBrd != 0 && (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrt))) && (MEMWBrd == IDEXrs)) ?  
                                    2'b01 : ((EXMEMRegWrite && EXMEMrd != 0 && EXMEMrd == IDEXrt && IDEXTest == 0) ? 2'b10 : 0);
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 10

令人惊讶的是,我将冒险投票并告诉您正确的方向是让您的代码处于相对可读的状态.

我怀疑你唯一能做的就是更糟糕的做法是将它作为正则表达式或将其转换为内联汇编:-)

不易转换的事实应该告诉你一些关于你正在尝试的智慧的事情.


根据您在其他地方的评论:

这是verilog,因此我需要在三元组中进行,并且不能有if else,否则我需要一个始终阻塞之前我不想要那个...我希望剩下的是0如果没有满足以上if else的条件

好吧,如果你必须这样做,反对我的建议(我并不是一个人提供这个建议),这里是你应该使用的方法(我不知道什么是"总是阻止",所以我不合格与你争论点.)

由于您当前的代码是设置ForwardAForwardB值,然后只在特定条件下更改它们,您可以通过反转顺序将其转换为三元组.这是因为,在您的if版本中,以后的代码优先,但早期的代码优先于三元组.

找出在什么情况下ForwardA,ForwardB并以相反的顺序设置并重建这些条件.

这是您的原始代码,压缩了一下.我也改变了你的2'b10东西,2'b10'所以我们仍然在SO渲染引擎中得到很好的格式 - 不要忘记将它们改回来.

ForwardA = 0;
ForwardB = 0;
if (EXMEMRegWrite == 1) begin
 if (EXMEMrd != 0)
    if (EXMEMrd == IDEXrs)
        ForwardA = 2'b10';
   if (EXMEMrd == IDEXrt && IDEXTest == 0)
        ForwardB = 2'b10';
end
if (MEMWBRegWrite == 1) begin
 if (MEMWBrd != 0) begin
    if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrs)))
            if (MEMWBrd == IDEXrs)
                ForwardA = 2'b01';
    if (IDEXTest == 0) begin
        if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrt)))
            if (MEMWBrd == IDEXrt)
                ForwardB = 2'b01';
    end
 end
end
Run Code Online (Sandbox Code Playgroud)

你可以看到B设置在三个地方.它设置2'b01在底部if,2'b10顶部和0开始.转换条件:

ForwardB = ((MEMWBRegWrite == 1) &&
            (MEMWBrd != 0) &&
            (IDEXTest == 0) &&
            (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrt))) &&
            (MEMWBrd == IDEXrt))
            ? 2'b01'
            : ((EXMEMRegWrite == 1) &&
               (EXMEMrd != 0) &&
               (EXMEMrd == IDEXrt && IDEXTest == 0))
               ? 2'b10'
               : 0;
Run Code Online (Sandbox Code Playgroud)

同样的A:

ForwardA = ((MEMWBRegWrite == 1) &&
            (MEMWBrd != 0) &&
            (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrs))) &&
            (MEMWBrd == IDEXrs))
            ? 2'b01'
            : ((EXMEMRegWrite == 1) &&
               (EXMEMrd != 0) &&
               (EXMEMrd == IDEXrs))
               ? 2'b10'
               : 0;
Run Code Online (Sandbox Code Playgroud)

现在这背后的理论是好的,但如果我在转录中犯了一个错误,或者如果Verilog只是厌恶地举手,拿起球,然后在家里小跑,我就不会感到有点惊讶了: - )

我是否至少可以建议,如果你必须遵循这条道路,你们两个:

  • 试着让三元表达式至少有点可读,所有漂亮的白色空间和多行; 和
  • 将原始代码保留在注释中,这样,如果您遇到问题或想要更改逻辑,至少可以回到它?

说真的,你会在六个月的时间内再次看到这个,感谢你,试图弄清楚你在想什么:-)

  • 为什么有人会说你应该说什么呢? (2认同)