File size: 1,027 Bytes
a8baeed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Bit Extractor - Single-bit and multi-bit extraction from a 64-bit word

module bit_extractor (
  input  logic [63:0] word_data,
  input  logic [5:0]  bit_index,
  input  logic [5:0]  field_width,  // For multi-bit extraction (1-64)
  input  logic        is_multibit,

  output logic [63:0] result
);

  logic [63:0] shifted_word;
  logic [63:0] mask;

  // Barrel shifter: rotate right by bit_index positions
  // This is combinational and synthesizes to mux tree
  assign shifted_word = word_data >> bit_index;

  // Generate mask for field width
  // For width=1: mask = 64'h0000_0000_0000_0001
  // For width=2: mask = 64'h0000_0000_0000_0003
  // For width=64: mask = 64'hFFFF_FFFF_FFFF_FFFF

  always_comb begin
    if (field_width == 6'h0)
      mask = 64'h0;
    else if (field_width == 6'd64)
      mask = 64'hFFFFFFFFFFFFFFFF;
    else
      mask = (64'h1 << field_width) - 1'b1;
  end

  // Extract field
  assign result = is_multibit ? (shifted_word & mask) : {63'h0, shifted_word[0]};

endmodule : bit_extractor