-
Notifications
You must be signed in to change notification settings - Fork 636
Open
Labels
Type:QuestionQuestionsQuestions
Description
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:
Metadata
Metadata
Assignees
Labels
Type:QuestionQuestionsQuestions