2016-07-16 43 views
0

我有3個值保存在觸發器上。在FSM的某個狀態期間,我想檢測哪一個是較大的值,並因此將一個數字輸出到存儲器中。如何正確編程verilog中的「函數」,對於這個特定的例子?

在頂部模塊文件的一面,我寫這樣的功能: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 

那麼我這樣做:

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 

我會喜歡問我是否正確地定義和調用函數,當我使用該函數時,我知道我必須使用與「變量」相同的函數名稱並用它來定義一個案例,對吧?那麼如何定義該函數的輸入,就像我在「HERE ???」中所做的那樣

此外,如果只有3個可能的答案,並且一個組合未被使用,那麼默認定義什麼?

回答

1

函數聲明是正確的。爲什麼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爲前綴,但它將假定值爲十進制且不匹配。案例陳述並不總是具備所有選項。你可以只有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 

http://www.testbench.in/TB_18_TASK_AND_FUNCTION.html

1

當我編碼這種類型的事情,我喜歡「明確」什麼狀態輸出將是爲每個個案,包括默認,即使它是一個錯誤。

問題的關鍵是你可以得到一個編譯器,當你命中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 
相關問題