繁体   English   中英

Verilog 函数返回错误值

[英]Verilog function returning wrong value

有人可以帮助我理解为什么我的功能无法正常工作吗?

module TestBench2();
 
localparam SELECT_NONE   = 0;
localparam SELECT_RAM    = 1;
localparam SELECT_VGA    = 2;
localparam SELECT_UNKNOWN = 8;
 
logic iClk;  
logic reset;
 
logic [ 4 : 0 ] chipSelect;
logic [ 4 : 0 ] requestChipSelect;
logic [ 4 : 0 ] chipSelected;
 
logic oVGAInitReadRequest;
logic oVGALineComplete;
 
initial
begin
  reset = 1;
  oVGAInitReadRequest = 0;
  oVGALineComplete = 0;  
  chipSelected = SELECT_UNKNOWN;
end
 
function automatic logic [ 4 : 0 ] chipSelectFunc;
input requestChipSelect, oVGAInitReadRequest, oVGALineComplete;
 
  if( requestChipSelect == SELECT_VGA )
  begin
    $display( "  requestChipSelect == SELECT_VGA?  -> YES");
    chipSelectFunc = SELECT_VGA;
    chipSelected   = SELECT_VGA;
  end
  else
  if( oVGAInitReadRequest )
  begin
    $display( "  oVGAInitReadRequest?  -> YES");
    chipSelectFunc = SELECT_VGA;
    chipSelected   = SELECT_VGA;
  end
  else
  if( oVGALineComplete )
  begin
    $display( "  oVGALineComplete?  -> YES");
    chipSelectFunc = SELECT_NONE;
    chipSelected   = SELECT_NONE;
  end
  else
  if( requestChipSelect == SELECT_RAM )
  begin
    $display( "  requestChipSelect == SELECT_RAM?  -> YES");
    chipSelectFunc = SELECT_RAM;
    chipSelected   = SELECT_RAM;
  end
  else
  if( requestChipSelect == SELECT_NONE )
  begin
    $display( "  requestChipSelect == SELECT_NONE?  -> YES");
    chipSelectFunc = SELECT_NONE;
    chipSelected   = SELECT_NONE;
  end
  else
  begin
    $display( "requestChipSelect -> STAY SAME");
    // Leave it as-is
    chipSelectFunc = chipSelected;
  end
 
endfunction
 
assign chipSelect = chipSelectFunc( requestChipSelect, oVGAInitReadRequest, oVGALineComplete );
 
integer count = 0;
 
always @( posedge iClk )
begin
  reset = 0;
 
  case( count )
     1: begin
          $strobe ("%2d:requestChipSelect <= SELECT_VGA", count);  
          requestChipSelect <= SELECT_VGA;
        end
 
     2: begin
          $strobe ("%2d:requestChipSelect <= SELECT_NONE", count);
          requestChipSelect <= SELECT_NONE;
        end      
 
     default: begin
          $strobe ("%2d:Default case", count);
        end
  endcase
 
  $strobe ("%2d:chipSelect: %d ", count, chipSelect);  
  count ++;
end
 
endmodule

当我运行上面的代码时,我得到这个作为输出:

# requestChipSelect -> STAY SAME
#  1:Default case
#  1:chipSelect:  8 
#   requestChipSelect == SELECT_NONE?  -> YES
#  2:requestChipSelect <= SELECT_VGA
#  2:chipSelect:  0 
#   requestChipSelect == SELECT_NONE?  -> YES

为什么当requestChipSelect设置为SELECT_VGA (2) 时,我的函数总是将此视为0

因为您已将requestChipSelect声明为 1 位宽:

function automatic logic [ 4 : 0 ] chipSelectFunc;
input requestChipSelect, oVGAInitReadRequest, oVGALineComplete;

而不是(例如)5,就像你的返回值:

function automatic logic [ 4 : 0 ] chipSelectFunc;
input [ 4 : 0 ] requestChipSelect;       
input oVGAInitReadRequest, oVGALineComplete;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM