Я обнаружил очень странное поведение при проектировании моего ALU, надеюсь, что кто-то может это посмотреть и рассказать мне, что происходит.Комбинационная логика «IF» и «присваивать» утверждение в systemverilog
Вот код
module adder (
output logic signed[31:0] y,
output logic Cout,
input logic signed[31:0] a, b,
input logic Cin, sub
);
logic [31:0] adder_b;
assign adder_b = b^{32{sub}};
assign {Cout, y} = {a[31],a} + {adder_b[31],adder_b} +Cin;
endmodule
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
module andlogic (
output logic [31:0] y,
input logic [31:0] a, b
);
assign y = a & b;
endmodule
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
module orlogic (
output logic [31:0] y,
input logic [31:0] a, b
);
assign y = a | b;
endmodule
////////////////////////////////////////////////////
////////////////////////////////////////////////////
////////////////////////////////////////////////////
module xorlogic (
output logic [31:0] y,
input logic [31:0] a, b
);
assign y = a^b;
endmodule
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
module ALU(
output logic signed[31:0] Result,
output logic N,Z,C,V,
input logic signed[31:0] a, b,
input logic [2:0] ALU_control
);
wire [31:0] adder_rlt, and_rlt, or_rlt, xor_rlt;
logic Cin;
adder adder (
.y (adder_rlt),
.a (a),
.b (b),
.Cin (Cin),
.Cout (Cout),
.sub (sub)
);
andlogic andlogic (
.y (and_rlt),
.a (a),
.b (b)
);
orlogic orlogic (
.y (or_rlt),
.a (a),
.b (b)
);
xorlogic xorlogic (
.y (xor_rlt),
.a (a),
.b (b)
);
assign C = Cout;
assign sub = ALU_control[1];
assign Cin = ALU_control[1];
assign N = Result[31];
//assign Z = (Result ==0)? 1:0;
assign V = {{~a[31]} & {~b[31]} & Result[31]}|{a[31] & b[31] & {~Result[31]}};
always_comb
begin
if (Result == 0) Z = 1;
else Z = 0;
case(ALU_control)
3'b001: Result = adder_rlt;
3'b010: Result = adder_rlt;
3'b011: Result = and_rlt;
3'b100: Result = or_rlt;
3'b101: Result = xor_rlt;
default: Result = 0;
endcase
end
endmodule
Первые 4 модулей являются отдельными функциями моего АЛУ, сумматор содержит как сложение и вычитание. Тогда вот странное дело:
Моего ALU имеет 4 флагов, Z представляют собой Зеро, он устанавливает, когда значение выходного сигнала Result
0. Если я использую эти символы, чтобы описать поведение Z
always_comb
begin
if (Result == 0) Z = 1;
else Z = 0;
Результат моделирования неверен, Z некоторое время равно 1, а некоторое время равно 0, и похоже, что оно не зависит от значения Result
.
Что более странно, это результат результата синтеза. Здесь изображение показывает часть моего результата синтеза synplify.
Уровень ворот выглядит правильно, Z представляет собой логический элемент И все перевернутого результат сигналов, которые, когда результат == 0, выходной сигнал Z должен быть 1.
Однако я тратить все мой день вчера попытался выяснить, как исправить эту ошибку, я понимаю, что если я использую инструкцию assign
вместо использования if
, то симуляция дает правильное поведение. assign Z = (Result ==0)? 1:0;
Я думал, что это две версии описания Z должны быть одинаковыми! После того, как я изменил мой код, используя
assign Z = (Result ==0)? 1:0;
Результат синтеза еще такой же, как картина, которую я показал выше ...
Может кто-нибудь сказать мне, что происходит? Большое спасибо !!!
Извините за моего бедного английского, надеюсь, мой вопрос имеет смысл для вас, ребята. –
В testbench мне удалось установить значение Result равное единице, добавив два нуля и вычесть две одинаковые переменные величины. Для первого результата Z равен 0, для второго результата Z - 1. –