ЛР1. Обновление тб и порядка выполнения задания

This commit is contained in:
Andrei Solodovnikov
2024-02-11 11:22:01 +03:00
parent 129c62bb93
commit 0692ae3117
4 changed files with 120 additions and 3568 deletions

View File

@@ -285,26 +285,30 @@ module fulladder32(
### Порядок выполнения задания
1. Согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md):
1. Создайте проект;
2. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder`.
2. Опишите в файле модуль `fulladder`, схема которого представлена на _[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.svg)_.
3. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder`.
4. Вставьте содержимое файла [`tb_fulladder.sv`](tb_fulladder.sv), расположенного рядом с данным документом.
5. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
6. Убедитесь по сигналам временной диаграммы, что модуль работает корректно.
7. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder4`.
8. Опишите модуль `fulladder4`, схема которого представлена на _Рис. 5 и 6_, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде `векторов`.
9. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 4-го разряда.
10. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder4`.
11. Вставьте содержимое файла [`tb_fulladder4.sv`](tb_fulladder4.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`.
12. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
13. Убедитесь по сигналам временной диаграммы, что модуль работает корректно.
14. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder32`.
15. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с помощью конструкции `generate for`).
16. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 31-го разряда.
17. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder32`.
18. Вставьте содержимое файла [`tb_fulladder32.sv`](tb_fulladder32.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`.
19. Запустите моделирование.
20. Убедитесь, что модуль работает корректно.
21. Следующим шагом вы можете проверить работоспособность вашей цифровой схемы в ПЛИС [здесь](https://github.com/MPSU/APS/tree/master/Labs/01.%20Adder/board%20files).
1. Создайте проект, согласно [руководству по созданию проекта в Vivado](../../Vivado%20Basics/Vivado%20trainer.md)
2. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder`.
3. Опишите в файле модуль `fulladder`, схема которого представлена на _[Рис. 2](../../.pic/Labs/lab_01_adder/fig_02.drawio.svg)_.
4. Проверьте 1-битный сумматор. Для этого:
1. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder`.
2. Вставьте содержимое файла [`tb_fulladder.sv`](tb_fulladder.sv), расположенного рядом с данным документом.
3. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
4. Убедитесь по сигналам временной диаграммы, что модуль работает корректно.
5. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder4`.
6. Опишите модуль `fulladder4`, схема которого представлена на _Рис. 5 и 6_, используя [`иерархию модулей`](../../Basic%20Verilog%20structures/Modules.md#%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9), чтобы в нем выполнялось поразрядное сложение двух 4-разрядных чисел и входного бита переноса. Некоторые входы и выходы модуля будет необходимо описать в виде [`векторов`](../../Basic%20Verilog%20structures/Modules.md#векторы).
1. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 4-го разряда.
7. Проверьте 4-битный сумматор. Для этого:
1. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder4`.
2. Вставьте содержимое файла [`tb_fulladder4.sv`](tb_fulladder4.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`.
3. Запустите моделирование. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
4. Проверьте содержимое TCL-консоли. Убедитесь в появлении сообщения о завершении теста. В случае, если в tcl-консоли написано `CLICK THE BUTTON 'Run All'`, вам необходимо нажать соответствующую кнопку на панели моделирования.
5. Убедитесь по сигналам временной диаграммы, что модуль работает корректно.
8. В `Design Sources` проекта создайте `SystemVerilog`-файл `fulladder32`.
9. Опишите модуль `fulladder32` так, чтобы в нем выполнялось поразрядное сложение двух 32-разрядных чисел и входного бита переноса. Его можно реализовать через последовательное соединение восьми 4-битных сумматоров, либо же можно соединить 32 однобитных сумматора (как вручную, так и с помощью конструкции `generate for`).
1. Обратите внимание, что входной бит переноса должен подаваться на сумматор, выполняющий сложение нулевого разряда, выходной бит переноса соединяется с выходным битом переноса сумматора, выполняющего сложение 31-го разряда.
10. Проверьте 32-битный сумматор. Для этого:
1. В `Simulation Sources` проекта создайте `SystemVerilog`-файл `tb_fulladder32`.
2. Вставьте содержимое файла [`tb_fulladder32.sv`](tb_fulladder32.sv). Нажмите по нему в окне `Sources` ПКМ и выберите `Set as Top`.
3. Запустите моделирование.
4. Проверьте содержимое TCL-консоли. Убедитесь в появлении сообщения о завершении теста. В случае, если в tcl-консоли написано `CLICK THE BUTTON 'Run All'`, вам необходимо нажать соответствующую кнопку на панели моделирования.
5. Если в tcl-консоли были сообщения об ошибках, разберитесь в причине ошибок по временной диаграмме и [исправьте их](../../Vivado%20Basics/Debug%20manual.md).
11. Проверьте работоспособность вашей цифровой схемы в ПЛИС [здесь](https://github.com/MPSU/APS/tree/master/Labs/01.%20Adder/board%20files).

View File

@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////////
// Company: MIET
// Engineer: Nikita Bulavin
// Engineer: Andrei Solodovnikov
// Module Name: tb_fulladder
// Project Name: RISCV_practicum
@@ -10,15 +10,12 @@
module tb_fulladder();
parameter TIME_OPERATION = 100;
parameter TEST_VALUES = 8;
wire tb_a_i;
wire tb_b_i;
wire tb_carry_i;
wire tb_carry_o;
wire tb_sum_o;
logic tb_a_i;
logic tb_b_i;
logic tb_carry_i;
logic tb_carry_o;
logic tb_sum_o;
logic [2:0] test_case;
fulladder DUT (
.a_i(tb_a_i),
@@ -28,51 +25,18 @@ parameter TEST_VALUES = 8;
.carry_o(tb_carry_o)
);
integer i, err_count = 0;
reg [4:0] running_line;
reg [5*8-1:0] line_dump;
wire sum_dump;
wire carry_o_dump;
assign tb_a_i = running_line[4];
assign tb_b_i = running_line[3];
assign tb_carry_i = running_line[2];
assign sum_dump = running_line[1];
assign carry_o_dump = running_line[0];
assign {tb_a_i, tb_b_i, tb_carry_i} = test_case;
initial begin
$display( "Start test: ");
`ifdef __debug__
for ( i = 0; i < TEST_VALUES; i = i + 1 )
begin
running_line = line_dump[i*5+:5];
#TIME_OPERATION;
if( (tb_carry_o !== carry_o_dump) || (tb_sum_o !== sum_dump) ) begin
$display("ERROR! carry_i = %b; (a)%b + (b)%b = ", tb_carry_i, tb_a_i, tb_b_i, "(carry_o)%b (sum_o)%b;", tb_carry_o, tb_sum_o, " carry_o_dump: %b, sum_dump: %b", carry_o_dump, sum_dump);
err_count = err_count + 1'b1;
end
end
$display("Number of errors: %d", err_count);
if( !err_count ) $display("\nfulladder SUCCESS!!!\n");
`else
for ( i = 0; i < TEST_VALUES; i = i + 1 )
begin
running_line = line_dump[i*5+:5];
#TIME_OPERATION;
end
$display("Test has been finished");
`endif
$finish();
$display("\nTest has been started\n");
#5ns;
test_case = 3'd0;
repeat(8) begin
#5ns;
test_case++;
end
$display("\nTest has been finished\n");
$finish();
end
initial line_dump = {
5'b00000,
5'b10010,
5'b01010,
5'b11001,
5'b00110,
5'b10101,
5'b01101,
5'b11111};
endmodule

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////////
// Company: MIET
// Engineer: Nikita Bulavin
// Engineer: Andrei Solodovnikov
// Module Name: tb_fulladder4
// Project Name: RISCV_practicum
@@ -10,14 +10,12 @@
module tb_fulladder4();
parameter TIME_OPERATION = 100;
parameter TEST_VALUES = 400;
wire [3:0] tb_a_i;
wire [3:0] tb_b_i;
wire tb_carry_i;
wire tb_carry_o;
wire [3:0] tb_sum_o;
logic [3:0] tb_a_i;
logic [3:0] tb_b_i;
logic tb_carry_i;
logic tb_carry_o;
logic [3:0] tb_sum_o;
logic [8:0] test_case;
fulladder4 DUT (
.a_i(tb_a_i),
@@ -27,445 +25,19 @@ module tb_fulladder4();
.carry_o(tb_carry_o)
);
integer i, err_count = 0;
reg [13:0] running_line;
reg [14*400:0] line_dump;
wire [3:0] sum_dump;
wire carry_o_dump;
assign tb_a_i = running_line[13:10];
assign tb_b_i = running_line[9:6];
assign tb_carry_i = running_line[5];
assign sum_dump = running_line[4:1];
assign carry_o_dump = running_line[0];
assign {tb_a_i, tb_b_i, tb_carry_i} = test_case;
initial begin
$display( "\nStart test: \n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop();
`ifdef __debug__
for ( i = 0; i < TEST_VALUES; i = i + 1 )
begin
running_line = line_dump[i*14+:14];
#TIME_OPERATION;
if( (tb_carry_o !== carry_o_dump) || (tb_sum_o !== sum_dump) ) begin
$display("ERROR! carry_i = %b; (a)%h + (b)%h = ", tb_carry_i, tb_a_i, tb_b_i, "(carry_o)%b (sum_o)%h;", tb_carry_o, tb_sum_o, " carry_o_dump: %b, sum_dump: %h", carry_o_dump, sum_dump);
err_count = err_count + 1'b1;
end
end
$display("Number of errors: %d", err_count);
if( !err_count ) $display("\nfulladder4 SUCCESS!!!\n");
`else
for ( i = TEST_VALUES-1; i >=0 ; i = i - 1 )
begin
running_line = line_dump[i*14+:14];
#TIME_OPERATION;
end
$display("Test has been finished");
`endif
$finish();
$display("Test has been started");
$display( "\n\n==========================\nCLICK THE BUTTON 'Run All'\n==========================\n"); $stop();
#5ns;
test_case = 3'd0;
repeat(512) begin
#5ns;
test_case++;
end
$display("\nTest has been finished\n");
$finish();
end
initial line_dump = {
14'h1787,
14'h1787,
14'h1f8b,
14'h0318,
14'h0c8a,
14'h0b1c,
14'h1110,
14'h0d0e,
14'h1914,
14'h0402,
14'h050a,
14'h1914,
14'h1008,
14'h0402,
14'h0108,
14'h050a,
14'h1218,
14'h1d16,
14'h090c,
14'h090c,
14'h1c0e,
14'h0804,
14'h0318,
14'h1008,
14'h1008,
14'h1a1c,
14'h1008,
14'h0e16,
14'h0210,
14'h1a1c,
14'h1a1c,
14'h0e16,
14'h0804,
14'h0612,
14'h0e16,
14'h180c,
14'h163c,
14'h0826,
14'h0c06,
14'h182e,
14'h102a,
14'h0804,
14'h1c0e,
14'h1008,
14'h0402,
14'h0c28,
14'h0022,
14'h0000,
14'h1c0e,
14'h142c,
14'h0846,
14'h0000,
14'h0064,
14'h0022,
14'h0064,
14'h0804,
14'h0022,
14'h0804,
14'h106c,
14'h0868,
14'h0826,
14'h0804,
14'h0804,
14'h180c,
14'h1008,
14'h180c,
14'h0000,
14'h0804,
14'h0000,
14'h00a6,
14'h1008,
14'h00c6,
14'h0022,
14'h0042,
14'h102a,
14'h0064,
14'h10ce,
14'h0000,
14'h104a,
14'h0022,
14'h00a6,
14'h01ae,
14'h1194,
14'h014a,
14'h00a6,
14'h014a,
14'h012a,
14'h0000,
14'h0064,
14'h0064,
14'h00c6,
14'h012a,
14'h0108,
14'h00e8,
14'h0042,
14'h014a,
14'h0318,
14'h0000,
14'h0022,
14'h039c,
14'h0294,
14'h033a,
14'h014a,
14'h018c,
14'h0294,
14'h0210,
14'h035a,
14'h0000,
14'h00c6,
14'h012a,
14'h073c,
14'h00a6,
14'h0042,
14'h014a,
14'h06fa,
14'h079e,
14'h0402,
14'h014a,
14'h06d8,
14'h052c,
14'h0210,
14'h0084,
14'h0444,
14'h0084,
14'h00a6,
14'h0108,
14'h04ea,
14'h0846,
14'h0210,
14'h07e3,
14'h05f2,
14'h0846,
14'h0ccc,
14'h0b3e,
14'h0e16,
14'h0c6a,
14'h052c,
14'h0804,
14'h0696,
14'h0612,
14'h1dfe,
14'h077e,
14'h018c,
14'h13a7,
14'h182e,
14'h1fad,
14'h1f49,
14'h1aa3,
14'h0b61,
14'h184e,
14'h00c6,
14'h11b6,
14'h14f2,
14'h0a78,
14'h0676,
14'h1323,
14'h1f29,
14'h1dfe,
14'h0ba3,
14'h1936,
14'h161a,
14'h0e16,
14'h0e58,
14'h0888,
14'h0db4,
14'h0970,
14'h058e,
14'h0990,
14'h19da,
14'h146e,
14'h04ea,
14'h165c,
14'h19da,
14'h033a,
14'h0210,
14'h0990,
14'h144c,
14'h0c06,
14'h0108,
14'h090c,
14'h039c,
14'h0b1c,
14'h0696,
14'h014a,
14'h1d58,
14'h0c48,
14'h0c48,
14'h1c50,
14'h02d6,
14'h1110,
14'h0108,
14'h0e9a,
14'h0804,
14'h1914,
14'h0084,
14'h0318,
14'h1c0e,
14'h1914,
14'h1110,
14'h1914,
14'h1e1e,
14'h1008,
14'h0084,
14'h1a81,
14'h050a,
14'h0a14,
14'h1c0e,
14'h1b05,
14'h1008,
14'h0c06,
14'h0210,
14'h071a,
14'h1e1e,
14'h1e1e,
14'h1e1e,
14'h090c,
14'h0108,
14'h0210,
14'h1c0e,
14'h0a14,
14'h0804,
14'h180c,
14'h1008,
14'h0612,
14'h180c,
14'h161a,
14'h0e16,
14'h1008,
14'h1e1e,
14'h0210,
14'h1a1c,
14'h140a,
14'h0634,
14'h0c06,
14'h0402,
14'h0804,
14'h0424,
14'h0c06,
14'h0424,
14'h0424,
14'h0826,
14'h0c06,
14'h102a,
14'h0402,
14'h180c,
14'h0804,
14'h0042,
14'h106c,
14'h0c48,
14'h1870,
14'h1008,
14'h0868,
14'h182e,
14'h0042,
14'h0042,
14'h1870,
14'h1008,
14'h102a,
14'h1008,
14'h102a,
14'h0022,
14'h00a6,
14'h1870,
14'h0868,
14'h10f0,
14'h00c6,
14'h104a,
14'h00e8,
14'h102a,
14'h108c,
14'h00a6,
14'h0064,
14'h0042,
14'h0000,
14'h0022,
14'h10ae,
14'h1194,
14'h102a,
14'h1132,
14'h012a,
14'h0022,
14'h0042,
14'h0000,
14'h00a6,
14'h00a6,
14'h01ae,
14'h0084,
14'h012a,
14'h0042,
14'h0042,
14'h0022,
14'h014a,
14'h0000,
14'h00a6,
14'h0000,
14'h0274,
14'h012a,
14'h0274,
14'h0022,
14'h00e8,
14'h014a,
14'h0000,
14'h0274,
14'h0232,
14'h00a6,
14'h012a,
14'h02f8,
14'h0042,
14'h079e,
14'h071a,
14'h06b8,
14'h0232,
14'h0612,
14'h05b0,
14'h014a,
14'h0232,
14'h0108,
14'h0084,
14'h01f0,
14'h012a,
14'h018c,
14'h0990,
14'h09b2,
14'h0612,
14'h0252,
14'h056e,
14'h0d72,
14'h0000,
14'h04c8,
14'h0c06,
14'h0c6a,
14'h0edc,
14'h09b2,
14'h0042,
14'h00a6,
14'h0e58,
14'h13c7,
14'h094e,
14'h165c,
14'h182e,
14'h0232,
14'h0dd4,
14'h0612,
14'h18b2,
14'h1f29,
14'h1a61,
14'h016c,
14'h0afc,
14'h140a,
14'h05d0,
14'h1110,
14'h06b8,
14'h05f2,
14'h1e1e,
14'h184e,
14'h1301,
14'h0e9a,
14'h1787,
14'h094e,
14'h02d6,
14'h08ca,
14'h11b6,
14'h06fa,
14'h0f21,
14'h0424,
14'h16e3,
14'h1aa3,
14'h039c,
14'h1194,
14'h073c,
14'h108c,
14'h108c,
14'h1b05,
14'h108c,
14'h1512,
14'h184e,
14'h0210,
14'h0b5e,
14'h0804,
14'h180c,
14'h090c,
14'h1fcd,
14'h148e,
14'h0dd4,
14'h129c,
14'h079e,
14'h0000,
14'h0888,
14'h108c,
14'h1194,
14'h1787,
14'h0b1c,
14'h0f83,
14'h1f07,
14'h0084,
14'h0402,
14'h0000,
14'h1110,
14'h108c,
14'h1512};
endmodule