在这个具体的例子中,如何正确编写verilog中的“函数”?

时间:2016-07-16 08:47:30

标签: function verilog fpga

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

在顶层模块文件的一侧,我正在写这样的函数:

ARRAY=()
while read LINE
do
ARRAY+=("$LINE")
done < $tempDir/text.txt

for LINE in "${ARRAY[@]}"
do
echo "$LINE" | sed -n ‘/B:/p' | sed 's/S:.*//' | sed -n -e 's/^.*M://p' | sed -n -e 's/-//p' >>/$tempDir/R128M.txt
done
for LINE in "${ARRAY[@]}"
do
echo "$LINE" | sed -n '/M:/p' | sed 's/I:.*//' | sed -n -e 's/^.*S://p' | sed -n -e 's/-//p' >>$tempDir/R128S.txt
done

cat $tempDir/R128M.txt
M=( $(sort $tempDir/R128M.txt) )

cat $tempDir/R128S.txt
S=( $(sort $tempDir/R128S.txt) )  

然后在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

我想问一下我是否正确定义和调用函数,当我使用函数时,我理解我必须使用与“变量”相同的函数名称并用它来定义一个案例,对?那么如何定义该函数的输入,就像我在“HERE ???”中所做的那样

此外,如果只有3个可能的答案,并且组合未被使用,那么默认情况下要定义什么?

2 个答案:

答案 0 :(得分:1)

功能声明是对的。为什么try: import Tkinter as tk # for Python2 except: import tkinter as tk # for Python3 win=tk.Tk() win.mainloop() 将其更改为input [7:-24]。 if语句嵌套也是错误的。

input [23:0]

案件陈述没问题。虽然值必须以2&b; b为前缀,但它将假定值为十进制且不匹配。 case语句不一定总是有所有选项。您只需要3个或多个。最好添加一个默认语句。您可以将值分配给默认值中的x或仅用于模拟打印错误。

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

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

答案 1 :(得分:1)

当我编写这种类型的东西时,我喜欢&#34;明确地&#34;说明每种情况下输出的内容,包括默认值,即使它是错误的。

关键是你可以得到一个编译器,当你点击2&#b; 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