Я использую iverilog
с флагом -g2012
для компиляции следующего кода матричного умножения и тестового стенда:
`timescale 1ns / 1ps
module testbench();
// Testbench parameters
parameter m1 = 2;
parameter n1 = 2;
parameter m2 = 2;
parameter n2 = 2;
// Testbench variables
logic clk;
real matrix_a[m1*n1-1:0];
real matrix_b[m2*n2-1:0];
real result_matrix[m1*n2-1:0];
// Instantiate the module under test
matrix_dot_product #(.m1(m1), .n1(n1), .m2(m2), .n2(n2)) uut (
.clk(clk),
.matrix_a(matrix_a),
.matrix_b(matrix_b),
.result_matrix(result_matrix)
);
initial clk = 0;
always #5 clk = ~clk;
initial begin
$dumpfile("testbench.vcd");
$dumpvars(0, testbench);
#10;
matrix_a[0] = 1.0;
matrix_a[1] = 2.0;
matrix_a[2] = 3.0;
matrix_a[3] = 4.0;
matrix_b[0] = 1.0;
matrix_b[1] = 2.0;
matrix_b[2] = 3.0;
matrix_b[3] = 4.0;
#10;
// $display("Result matrix:");
for (int i = 0; i < m1*n2; i++) begin
$display("result_matrix[%0d] = %f", i, result_matrix[i]);
end
// Finish the simulation
$finish;
end
endmodule
module matrix_dot_product #(
parameter m1 = 2,
parameter n1 = 2,
parameter m2 = 2,
parameter n2 = 2
)(
input logic clk,
input real matrix_a[m1*n1-1:0],
input real matrix_b[m2*n2-1:0],
output real result_matrix[m1*n2-1:0]
);
integer i, j, k;
real sum;
real product;
always @(posedge clk) begin
for (i = 0; i < m1; i++) begin
for (j = 0; j < n2; j++) begin
sum = 0;
for (k = 0; k < n1; k++) begin
product = matrix_a[i*n1+k] * matrix_b[k*n2+j];
sum = sum + product;
end
result_matrix[i*n2+j] = sum;
end
end
for (int i = 0; i < m1*n2; i++) begin
$display("result_matrix[%0d] = %f", i, result_matrix[i]);
end
end
endmodule
При запуске этого тестового стенда умножения матриц я получаю следующий результат:
MODULE OUTPUT
result_matrix[0] = 0.000000
result_matrix[1] = 0.000000
result_matrix[2] = 0.000000
result_matrix[3] = 0.000000
MODULE OUTPUT
result_matrix[0] = 7.000000
result_matrix[1] = 10.000000
result_matrix[2] = 15.000000
result_matrix[3] = 22.000000
TEST BENCH OUTPUT
result_matrix[0] = 0.000000
result_matrix[1] = 0.000000
result_matrix[2] = 0.000000
result_matrix[3] = 0.000000
Судя по моим выводам, код правильно умножается при работе внутри модуля; однако, похоже, это не влияет на вывод матрицы в тестовом стенде. Буду признателен за любую помощь в этом вопросе.
В вашем коде возникают ошибки компиляции, когда я пытаюсь запустить установленную у меня версию iverilog
(10.3).
Однако код выдает ожидаемый результат, когда я запускаю симуляторы Cadence и Synopsys:
result_matrix[0] = 0.000000
result_matrix[1] = 0.000000
result_matrix[2] = 0.000000
result_matrix[3] = 0.000000
result_matrix[0] = 7.000000
result_matrix[1] = 10.000000
result_matrix[2] = 15.000000
result_matrix[3] = 22.000000
result_matrix[0] = 7.000000
result_matrix[1] = 10.000000
result_matrix[2] = 15.000000
result_matrix[3] = 22.000000
Это ошибка в используемой вами версии iverilog
. Попробуйте свой код на EDA Playground.
Было бы полезно показать $time
и иерархию %m
в ваших $display
утверждениях.