【问题标题】:How to use case statement instead of for-loop in verilog如何在verilog中使用case语句而不是for循环
【发布时间】:2021-10-21 05:55:55
【问题描述】:

以下是在Verilog的描述的七人表决程序,但由于在for循环的效率,我想改变的 for循环强>成的 case语句强>

module voter7(pass, vote);

output pass;
input[6:0] vote;
reg[2:0] sum;

integer i;
reg pass;

always @(vote) 
    begin
        sum = 0;
        for(i=0; i<=6; i=i+1)
            if(vote[i]) sum = sum+1;
        if(sum[2]) pass = 1;
        else pass = 0;
    end

endmodule

这是我的教授留下的分配。恰好,我想用case语句重写下面的代码。 P>

for(i=0; i<=6; i=i+1)
  if(vote[i]) sum = sum+1;

【问题讨论】:

  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: for-loop verilog


【解决方案1】:

与“C”等不同的高级编程语言不同,Verilog case 语句包含隐式中断语句。 verilog-case-statement in Verilog Tutorial

根据我的经验,您的教授可能犯了一个错误,他认为 Verilog 可以顺序执行多个案例语句,但实际上它不能做到这一点。 所以,你可以用下面这种别扭的方式来回复你的教授。

module voter7(pass, vote);

output pass;
input[6:0] vote;
reg[2:0] sum;

integer i;
reg pass;

always @(vote) 
    begin
        sum = 0;

        casez(vote)
            7'b??????1: sum = sum + 1;
        endcase
        casez(vote)
            7'b?????1?: sum = sum + 1;
        endcase
        casez(vote)
            7'b????1??: sum = sum + 1;
        endcase
        casez(vote)
            7'b???1???: sum = sum + 1;
        endcase
        casez(vote)
            7'b??1????: sum = sum + 1;
        endcase
        casez(vote)
            7'b?1?????: sum = sum + 1;
        endcase
        casez(vote)
            7'b1??????: sum = sum + 1;
        endcase
        
        if(sum[2]) pass = 1;
        else pass = 0;
    end

endmodule

【讨论】:

    【解决方案2】:

    for 循环不一定比 case 语句效率低。问题是“+”运算符。在您的情况下,综合可以尝试生成 7 个顺序加法器,影响门数和时序。

    其中一个想法是创建一个巨大的 case 语句,列出所有可能的 4+ 位组合。这将改善时序,不一定是门的数量。

    casez(vote)
    7'b???1111,
    7'b??1?111,
    7'b??11?11,
    .... : pass = 1;
    
    defalut: pass = 0;
    

    唯一的问题是列出 7 位系统中所有可能的 4 位组合。我会把它留给你。建议是创建一个测试台并比较循环和案例语句的结果。

    顺便说一句,使用always @* 而不是总是@(投票)。养成习惯,以后会避免很多错误。

    【讨论】:

      【解决方案3】:

      我看到在 for 循环中你只有一个赋值(sum = sum + 1)。您可以在没有 case 语句的情况下编写此逻辑。

      always@(*)
      begin
       sum = |vote ? sum + 1 : 'd0;
       pass = sum[2];
      end
      

      但是,如果您只希望有一个案例陈述,那么请参见下文

      always@(*)
      begin
        case(1'd1)
         vote[0] : sum = sum + 1;
         vote[1] : sum = sum + 1;
         vote[2] : sum = sum + 1;
         vote[3] : sum = sum + 1;
         vote[4] : sum = sum + 1;
         vote[5] : sum = sum + 1;
         vote[6] : sum = sum + 1;
         default : sum = 'd0;
       endcase
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多