Арифметический сдвиг действует как логический сдвиг независимо от знаковой переменной.

У меня есть регистр, объявленный так:

logic signed [15:0][2:0][15:0] registers;

Когда я помещаю число комплимента 2 в массив и арифметически сдвигаю число, вместо этого оно логически сдвигается:

registers[0][0] = 16'b1000000000000000;
registers[0][0] = registers[0][0]>>>2;

Судя по всему, система будет выполнять логический сдвиг вместо арифметического, если число не подписано. Однако, как вы можете ясно видеть, «регистры» определенно подписаны.

Кто-нибудь знает, что мне здесь может не хватать?

Спасибо!


person user1567095    schedule 07.01.2013    source источник


Ответы (1)


С Verilog, как только вы выберете часть, результат будет unsigned. Используйте системную задачу $signed для выбранной детали, чтобы сделать ее подписанной.

res = $signed(registers[0][0]) >>> 2;
person Marty    schedule 07.01.2013
comment
Является ли это синтетическим? Есть ли другой способ сделать это? - person Parth K; 08.09.2018
comment
В SystemVerilog вы также можете использовать приведение типов res = signed'(registers[0][0]) >>> 2; Оба должны быть синтезируемыми. - person dave_59; 08.09.2018
comment
у меня это сработало следующим образом: res = $signed(registers[0][0] >>> 2); - person Delfino; 12.04.2021