不使用移位运算符的算术右移

Arithmetic Right Shift without using shift operators

我想在 verilog 中写一个 16 Bit Arithmetic right shift function 而不使用 shift operators

到目前为止我的代码:

module my_shift(Number, Range, Shifted);
  input [15:0] Number;
  input [3:0] Range;
  output[15:0] Shifted;
  reg Shifted;

always @(Number)
  Shifted = shifted_number(Number, Range);
   
    function[15:0] shifted_number;
     input [15:0] number;
     input [3:0] Range;         //4 bit shift range
     integer i;
     integer j;
     
     begin
         for (i = 0; i < Range; i = i + 1) begin
             for (j = 0; j < 15; j = j + 1) begin
                shifted_number[j] = number[j+1];
             end
         end
         shifted_number[15] = number[15];
     end
      
    endfunction

endmodule

我写了一个简单的 Testbench 来测试我的 function。 我只想 shift 三个不同的数字乘以 1 bit.

我的测试平台:

module test;
reg [15:0] Number;
reg [3:0] Range;
wire[15:0]  shifted;

my_shift shift_number(Number, Range,shifted);

initial
$monitor($time," -->Number = %b, shifted = %b, ",Number,shifted);

initial begin
Range = 1;
Number = 3; 

#10;
Number = 4; 

#10;
Number = 5; 

#100 $finish;
end

endmodule

这给了我以下 output:

0 -->Number = 0000000000000011, shifted = 0000000000000001,

10 -->Number = 0000000000000100, shifted = 0000000000000000,

20 -->Number = 0000000000000101, shifted = 0000000000000000,

它可以编译,但有一个警告:

my_shift shift_number(Number, Range,shifted);

警告:

warning: Port sizes don't match in port #3

为什么编译器给我这个警告,为什么输出不正确?

您错误地将 Shifted 声明为 1 位 reg:

变化:

  output [15:0] Shifted;
  reg Shifted;

至:

  output reg [15:0] Shifted;

我现在得到这个输出:

           0 -->Number = 0000000000000011, shifted = 1000000000000001, 
          10 -->Number = 0000000000000100, shifted = 1000000000000010, 
          20 -->Number = 0000000000000101, shifted = 1000000000000010, 

我 运行 你的代码在 2 个不同的模拟器上运行,得到了更多有用的警告和错误消息。您可以在 edaplayground.

上碰碰运气