Skip to content

Ask a question related to Ibex alu bitcounting #2294

@ESE-2019

Description

@ESE-2019

What is the purpose of bitcnt_bit_mask & ~bitcnt_mask_op? I find it that it still works properly without & ~bitcnt_mask_op. Here are the rawcode in ibex_alu and my C test program.

Rawcode:

    always_comb begin
      bitcnt_bit_mask = bitcnt_mask_op;
      bitcnt_bit_mask |= bitcnt_bit_mask << 1;
      bitcnt_bit_mask |= bitcnt_bit_mask << 2;
      bitcnt_bit_mask |= bitcnt_bit_mask << 4;
      bitcnt_bit_mask |= bitcnt_bit_mask << 8;
      bitcnt_bit_mask |= bitcnt_bit_mask << 16;
      bitcnt_bit_mask = ~bitcnt_bit_mask;
    end

    assign zbe_op = (operator_i == ALU_BCOMPRESS) | (operator_i == ALU_BDECOMPRESS);

    always_comb begin
      unique case (1'b1)
        zbe_op:      bitcnt_bits = operand_b_i;
        bitcnt_cz:   bitcnt_bits = bitcnt_bit_mask & ~bitcnt_mask_op; // clz / ctz
        default:     bitcnt_bits = operand_a_i; // cpop
      endcase
    end

C test code:

#include <stdio.h>
#include <stdint.h>

uint64_t check_pass_num = 0;

void check(uint32_t bitcnt_mask_op)
{
      uint32_t bitcnt_bit_mask;

      bitcnt_bit_mask = bitcnt_mask_op;
      bitcnt_bit_mask |= bitcnt_bit_mask << 1;
      bitcnt_bit_mask |= bitcnt_bit_mask << 2;
      bitcnt_bit_mask |= bitcnt_bit_mask << 4;
      bitcnt_bit_mask |= bitcnt_bit_mask << 8;
      bitcnt_bit_mask |= bitcnt_bit_mask << 16;
      bitcnt_bit_mask = ~bitcnt_bit_mask;
      if (bitcnt_bit_mask != (bitcnt_bit_mask & ~bitcnt_mask_op))
            printf("%x check fail\n", bitcnt_mask_op);
      else
            check_pass_num++;
}

int main()
{
      for (uint32_t i = 0; i < UINT32_MAX; i++)
            check(i);
      check(UINT32_MAX);
      printf("check_pass_num = %ld\n", check_pass_num);
      return 0;
}

Result: check_pass_num = 4294967296

My Environment

EDA tool and version:

gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)
Operating system:

Ubuntu Linux 24.04

Version of the Ibex source code:

e5b8d05

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions