Function 如何正确编程“a”;功能“;在verilog中,对于这个特定的示例?

Function 如何正确编程“a”;功能“;在verilog中,对于这个特定的示例?,function,verilog,fpga,Function,Verilog,Fpga,我有3个值保存在触发器上。在FSM上的某个状态期间,我想检测哪个值更大,因此,将一个数字输出到内存中 在顶层模块文件的一侧,我编写了如下函数: function [1:0] max_val; input [7:-24] A, B, C; begin if (A > B) begin if (A > C) max_val = 2'b01; else max_val = 2'b11

我有3个值保存在触发器上。在FSM上的某个状态期间,我想检测哪个值更大,因此,将一个数字输出到内存中

在顶层模块文件的一侧,我编写了如下函数:

function [1:0] max_val; 
input [7:-24] A, B, C;

begin
    if (A > B)
    begin
        if (A > C)  
            max_val = 2'b01;  
        else
            max_val = 2'b11;
    end 
        else if(B > C)
                    max_val = 2'b10;  
                else
                    max_val = 2'b11;

    else
        max_val = 2b'00;

end
endfunction
然后在FSM状态期间,我执行以下操作:

S13:
            begin

                case (max_val(FF_v1, FF_v2, FF_v3))    /// HERE??

                    01:
                            begin
                                mem_out1 = 1;
                            end
                    10:
                            begin
                                mem_out2 = 1;
                            end
                    11:  
                            begin
                                mem_out3 = 1;
                            end
                    00:      
                            begin
                              ...       /// what to do here??
                             end     

                  endcase
             end
我想问一下,我是否正确地定义和调用了函数,当我使用函数时,我知道我必须使用与“variable”相同的函数名,并使用它来定义案例,对吗?那么,我如何定义该函数的输入,就像我在“HERE???”中所做的那样


另外,如果只有3个可能的答案,并且组合中的一个没有使用,那么在默认情况下定义什么???

函数声明是正确的。为什么
input[7:-24]
将其更改为
input[23:0]
。if语句嵌套也不正确

function [1:0] max_val;

input [23:0] A, B, C;

begin
   max_val = 0 ;
    if (A > B)
    begin
        if (A > C)
            max_val = 2'b01;
        else
            max_val = 2'b11;
    end
    else
        if(B > C)
                max_val = 2'b10;
        else
               max_val = 2'b11;  
end
endfunction
案例陈述很好。尽管这些值必须以2'b作为前缀,否则它将假定该值为十进制且不匹配。case语句不必总是具有所有选项。您只能有3个或您需要的数量。最好添加一个默认语句。可以在默认情况下将值指定给x,也可以仅打印错误以进行模拟

case ( max_val(a,b,c) )
  2'b01 :  begin
                mem_out_1 = 1;
        end
  2'b10 :  begin
                mem_out_2 = 1;
        end
  2'b11 :  begin
                mem_out_3 = 1;
        end
  // no need for 00 case 
  default : begin
                $display(" error val ");
            end
endcase

函数声明是正确的。为什么
input[7:-24]
将其更改为
input[23:0]
。if语句嵌套也不正确

function [1:0] max_val;

input [23:0] A, B, C;

begin
   max_val = 0 ;
    if (A > B)
    begin
        if (A > C)
            max_val = 2'b01;
        else
            max_val = 2'b11;
    end
    else
        if(B > C)
                max_val = 2'b10;
        else
               max_val = 2'b11;  
end
endfunction
案例陈述很好。尽管这些值必须以2'b作为前缀,否则它将假定该值为十进制且不匹配。case语句不必总是具有所有选项。您只能有3个或您需要的数量。最好添加一个默认语句。可以在默认情况下将值指定给x,也可以仅打印错误以进行模拟

case ( max_val(a,b,c) )
  2'b01 :  begin
                mem_out_1 = 1;
        end
  2'b10 :  begin
                mem_out_2 = 1;
        end
  2'b11 :  begin
                mem_out_3 = 1;
        end
  // no need for 00 case 
  default : begin
                $display(" error val ");
            end
endcase

当我编写这种类型的代码时,我喜欢“确定”地说明每种情况下的输出,包括默认值,即使它是一个错误

关键是,你可以得到一个编译器,当你达到2'b01状态时,它决定只分配mem_out1,并且永远保持设置,因为没有任何东西会将它设置回零。不确定这是设计的重点,还是可能是不希望的行为

case ( max_val(a,b,c) )
2'b01 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b001;
       end
2'b10 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b010;
       end
2'b11 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b100;
       end
// no need for 00 case 
default : begin
               // {mem_out_3,mem_out_2,mem_out_1} = 3'b000;  // Uncomment if you need to control the output in the event of an error
               $display(" error val ");
           end
endcase

当我编写这种类型的代码时,我喜欢“确定”地说明每种情况下的输出,包括默认值,即使它是一个错误

关键是,你可以得到一个编译器,当你达到2'b01状态时,它决定只分配mem_out1,并且永远保持设置,因为没有任何东西会将它设置回零。不确定这是设计的重点,还是可能是不希望的行为

case ( max_val(a,b,c) )
2'b01 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b001;
       end
2'b10 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b010;
       end
2'b11 :  begin
               {mem_out_3,mem_out_2,mem_out_1} = 3'b100;
       end
// no need for 00 case 
default : begin
               // {mem_out_3,mem_out_2,mem_out_1} = 3'b000;  // Uncomment if you need to control the output in the event of an error
               $display(" error val ");
           end
endcase