Function 如何正确编程“a”;功能“;在verilog中,对于这个特定的示例?
我有3个值保存在触发器上。在FSM上的某个状态期间,我想检测哪个值更大,因此,将一个数字输出到内存中 在顶层模块文件的一侧,我编写了如下函数: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
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