2 ^ n至n个优先级编码器,带连续分配

问题描述

n正在参数化。我已经编写了这段代码,并且在我同时编写的测试平台上运行时也无法正常工作。向下滚动即可查看所有内容...

module p2_encoder
#(
    parameter SIZE_OUT = 3,parameter SIZE_IN  = 2 ** SIZE_OUT-1
)
(
    input logic [SIZE_IN :0]    encoder_in,output logic [SIZE_OUT:0]    encoder_out,output logic [7:0]    test_out
);

assign test_out = SIZE_OUT;
  
genvar i;
  
generate
  for(i = SIZE_IN; i >= 0; i = i - 1) begin
    assign encoder_out[i] = (encoder_in[i]) ? i : 0;
  end
endgenerate

endmodule

在本示例中,测试台如下所示,其中n = 4,但是它应该在用户选择的n不变的情况下工作:

module test;
parameter ENCODER_OUT  = 4;
parameter ENCODER_SIZE = (2 ** ENCODER_OUT) - 1;


logic clk = 0;
parameter   CLK_PERIOD = 10;    // clock period is 10 time units

////////////////////////

logic [ENCODER_SIZE:0] encoder_in,i,test_out;
logic [ENCODER_OUT:0] encoder_out;

// instantiation
p2_encoder encoder_1(.*);
// defining the parameter of this encoder
defparam encoder_1.SIZE_OUT = ENCODER_SIZE;

// test vectors
initial 

begin 

    $display("\n--------------------");
    // do an exhuastive test using ALL inputs
    // this for loop covers everything until
    // the last,highest input.
    // done this way to prevent infinite 
    // looping
    for(i=0; i <= 2*ENCODER_OUT; i = i + 1)
    begin
        encoder_in = i;
        #1
        $display("input =  %b,output = %d",encoder_in,encoder_out);
    end
    // the last,highest input value
    encoder_in = i;
        #1
    $display("input =  %b,encoder_out);
   

    $display("\n --------------------\n");
        
 
    $stop;
end

endmodule

testbench结果给出了错误的结果,如下所示。如何更正我的代码以获得正确的结果?

# input = 0000000000000000,output = 0 
# input = 0000000000000001,output = 0 
# input = 0000000000000010,output = 2 
# input = 0000000000000011,output = 2 
# input = 0000000000000100,output = 0 
# input = 0000000000000101,output = 0 
# input = 0000000000000110,output = 2 
# input = 0000000000000111,output = 2 
# input = 0000000000001000,output = 8 
# input = 0000000000001001,output = 8

正确的结果应该看起来像...

# input = 0000000000000000,output = 1 
# input = 0000000000000011,output = 1 
# input = 0000000000000100,output = 2 
# input = 0000000000000101,output = 2 
# input = 0000000000000110,output = 3 
# input = 0000000000001001,output = 3

我知道错误位于assign encoder_out[i] = (encoder_in[i]) ? i : 0行中,但是我不知道该怎么做。

解决方法

您不能使用生成块以算法方式进行操作。生成块是在实际程序编译之前的预处理步骤中进行评估的,因此无法基于动态变量进行调节。

您可以编写如下表达式:

class HomeFragment extends Fragment implements RecyclerAdapter.ItemClickListener {

    ...

    @Override
    public void onItemClicked(Model model) {
        viewModel.saveFavorite(model);            
        router.openWebView(model.getUrl());
    }

    ...

}

如果您看到它是递归的,则需要手动展平递归级别,并且不能在生成块中使用循环递归来做到这一点。您将需要具有动态循环的动态功能。

这是一个建议。您可以从assign语句调用一个函数。不确定这是否可以综合,但是它解释了Always块的可能替代方法。

assign encoder_out = (encoder_in >> 1) == 1 ? 1 : (encoder_in >> 2) == 1 ? 2 (encoder_in >> 3) == 1 ? 3 : 0;