Помогите разобраться.
Задача - за один такт прочитать два регистра из регистрового файла, сложить их и записать результат обратно в регистровый файл. Перепробовал всё - блокирующее и неблокирующее копирование в разных комбинациях, затем погонял все варианты на Icarus Verilog, потом любовался результатом в GTKWave - ну не получается же. Уже возникли сомнения, что такое вообще можно сделать за один такт.
На специализированные форумы прошу не отсылать - спрошу там, как время придёт.
Регистры читаются вот отсюда:
module reg_ram (
input [4:0] address_a,
input [4:0] address_b,
input clock,
input [31:0] data_a,
input [31:0] data_b,
input wren_a,
input wren_b,
output reg [31:0] q_a,
output reg [31:0] q_b);
reg [31:0] ram[31:0];
always @(posedge clock) begin
if(wren_a) begin
ram[address_a] <= data_a;
q_a <= data_a;
end else
q_a <= ram[address_a];
end
always @(posedge clock) begin
if(wren_b) begin
ram[address_b] <= data_b;
q_b <= data_b;
end else
q_b <= ram[address_b];
end
endmodule
Реализацию модуля взял вот отсюда: http://www.altera.com/support/examples/verilog/ver-true-dual-port-ram-sclk.html
Может быть его можно как-то переписать, чтобы поместиться в один такт?