Трудности с моим ALU в verilog
Так что я проектирую ALU в Verilog, пока я изучаю его. Я придумал следующий код: Testbench:
module ALUtb;
reg clock = 1'b0;
reg [0:7] val1;
reg [0:7] val2;
initial begin
val1 = 8'b01010100;
val2 = 8'b10101000;
#50 $finish;
end
ALU piet(val1, val2,, clock);
always begin
#5 clock = ~clock
;
end
endmodule
Main code:
// Code your design here
module ALU(
a1, a2, out, clock
);
output [0:7] out;
input [0:7] a1;
input [0:7] a2;
input clock;
wire clock;
reg out;
wire co;
wire a1, a2;
wire [0:7] poep;
initial begin
$monitor("Out=%d, co=%d, a=%d, a2=%d, poep=%d, clock=%d", out, co, a1, a2, poep, clock);
end
always @ (posedge clock) begin
out <= poep;
end
adder addy(.output_byte(poep), .co(co), .a1(a1), .a2(a2), .clock(clock));
endmodule
module adder(
output_byte, co, a1, a2, clock
);
initial begin
output_byte = 8'b00000011;
end
input [0:7] a1;
input [0:7] a2;
input clock;
output [0:7] output_byte;
output output_bit;
output co;
wire c1;
reg b1, b2;
reg [0:7] output_byte;
wire output_bit;
integer i;
always @ (posedge clock) begin
for(i = 0; i < 8; i = i + 1) begin
b1 = (a1[i] & (1 << i));
b2 = (a2[i] & (1 << i));
#1 output_byte[i] = output_bit;
end
end
bitadder b_adder(.out(output_bit), .co(), .a1(b1), .a2(b2), .c1(c1));
endmodule
// Deze module is een 1-bits adder.
module bitadder(out, co, a1, a2, c1);
output out, co;
input a1, a2, c1;
wire out, co;
wire a1;
wire a2;
wire c1;
assign {co, out} = a1 + a2 + c1;
endmodule
Итак, в результате я получаю:
Out= x, co=z, a= 84, a2=168, poep= 3, clock=0
Out= 3, co=z, a= 84, a2=168, poep= x, clock=1
Out= 3, co=z, a= 84, a2=168, poep= x, clock=0
Out= x, co=z, a= 84, a2=168, poep= x, clock=1
Out= x, co=z, a= 84, a2=168, poep= x, clock=0
Out= x, co=z, a= 84, a2=168, poep= x, clock=1
Out= x, co=z, a= 84, a2=168, poep= x, clock=0
Out= x, co=z, a= 84, a2=168, poep= x, clock=1
Out= x, co=z, a= 84, a2=168, poep= x, clock=0
Out= x, co=z, a= 84, a2=168, poep= x, clock=1
Out= x, co=z, a= 84, a2=168, poep= x, clock=0
Как видите, это только 8-битный сумматор. Так как даже это еще не работает, мы еще не приступили. Мой конкретный вопрос: почему выход не меняется должным образом? Poep походит на буфер для фактического вывода. co - бит выноса, a - первое число, a2 - второе число, c1 - бит переноса, а остальное должно говорить само за себя. Почему мои результаты не определены?
Любая помощь приветствуется!
Заранее спасибо!
2 ответа
Ну, потому что вы назначаете его на провод, значение которого не определено, в каждом такте. Если вы хотите, чтобы poep был буфером, сделайте его reg, а не проводным. провода не содержат данных.
Ваши выходные данные не определены, потому что вы никогда не присваивали значение сигналу внутри модуля. Вы заявили какwire
, которое по умолчанию имеет значение высокого импеданса (z). Проблема в том, что вы никогда не водите его с известным значением.
Подключениеc1
на входbitadder
приводит к тому, что выходные данные этого модуля становятся неизвестными (x), и это неизвестное распространяется вверх по иерархии модулей.
Самое простое решение — изменить:
wire c1;
к:
wire c1 = 0;
Это проясняет неизвестные результаты:
Out=x, co=z, a=0, a2=0, poep= 3, clock=0
Out=1, co=z, a=0, a2=0, poep= 3, clock=1
Out=1, co=z, a=0, a2=0, poep= 3, clock=0
Out=1, co=z, a=0, a2=0, poep= 1, clock=0
Out=1, co=z, a=0, a2=0, poep= 0, clock=0
Out=0, co=z, a=0, a2=0, poep= 0, clock=1
Out=0, co=z, a=0, a2=0, poep= 0, clock=0
Out=0, co=z, a=0, a2=0, poep= 0, clock=1
Out=0, co=z, a=0, a2=0, poep= 0, clock=0
Out=0, co=z, a=0, a2=0, poep= 0, clock=1
Out=0, co=z, a=0, a2=0, poep= 0, clock=0
Out=0, co=z, a=0, a2=0, poep= 0, clock=1
Мои симуляторы выдали мне ошибку компиляции наoutput_byte
сигнал вadder
модуль. Я удалил эту строку, чтобы избавиться от ошибки компиляции:
output output_bit;