Professional Documents
Culture Documents
Lab 0 SystemVerilog PDF
Lab 0 SystemVerilog PDF
MỤC LỤC
MỤC LỤC 1
Giới Thiệu 3
Mục tiêu 3
Yêu cầu 3
Góp ý 3
Quy Trình 4
Phụ Lục 31
Cài đặt Ubuntu trong Windows 31
Linux 34
1
203B3 - DOE - HCMUT
Basic Commands 34
Cài đặt Quartus 13.0sp1 36
2
203B3 - DOE - HCMUT
Giới Thiệu
Mục tiêu
1. Hiểu được quy trình cơ bản để thiết kế và nạp lên KIT
2. Biết cách sử dụng các command cơ bản trong Linux
3. Hiểu được cách viết code và testbench
Yêu cầu
Sinh viên cần chuẩn bị những programs sau:
Ngoài ra, sinh viên cần tìm hiểu cách sử dụng Linux cơ bản (Phụ Lục)
Góp ý
Nếu có bất kỳ lỗi gì hay góp ý trong tài liệu này, vui lòng gởi email tới địa chỉ cxhai.sdh221@hcmut.edu.vn
3
203B3 - DOE - HCMUT
Quy Trình
1. RTL Coding: Thiết kế thuật toán, FSM,... để giải quyết các yêu cầu được đặt ra, ngôn ngữ thiết kế ở
đây là SystemVerilog HDL.
2. Lint Check: Kiểm tra những lỗi về cú pháp/syntax hoặc những cách viết code có khả năng gây ra lỗi
hoặc bug. Lint cần được chạy sau khi viết code xong. Lưu ý, Lint Check là quy trình kiểm tra code tĩnh
- tức là code sẽ không được chạy, nên tính đúng đắn và hoạt động của code sẽ không được kiểm tra.
→ Nếu Lint Check báo lỗi, cần đọc lỗi để biết lỗi gì, ở dòng nào → Sửa code
3. Verification: Kiểm tra hoạt động của code - dựa trên yêu cầu thiết kế, ứng với input này thì code được
mong đợi sẽ cho output ra sao. Đây là quy trình kiểm tra tính đúng đắn của code.
→ Nếu Verification có lỗi, cần đọc code để biết lỗi gì, ở dòng nào → Sửa code → Lint Check
4. Implementation: Thiết kế sau khi Verification hoàn tất đã đạt yêu cầu thì sẽ được nạp lên KIT (DE2
hoặc DE10 hay nhưng KIT FPGA khác).
4
203B3 - DOE - HCMUT
1. Problem
Thiết kế mạch tổ hợp sau.
5
203B3 - DOE - HCMUT
2. Design
Tạo Project
Tại ~ (cd ~ nếu cần thiết), tạo directory projects, trong đó tạo directory lab0, trong lab0 lấy template trên
GitHub để sử dụng, đặt tên là ex01.
gettemplate ex01
Gõ ls để xem các files và thư mục có trong thư mục hiện tại, hoặc tree nếu muốn xem cây thư mục.
$ tree
.
└── ex01
├── filelist
├── makefile
├── quartus
│ ├── de10_pin_assign.qsf
│ └── de2_pin_assign.qsf
└── test
├── driver.cpp
└── tb_top.cpp
3 directories, 6 files
Một project cần được sắp xếp gọn gàng như sau:
• Tất cả các file design .sv cần đặt trong directory src.
• Đi vô ex01: cd ex01 và tạo thư mục src: mkdir src
• Soạn thảo: tạo file hoặc sửa file (nếu file đã tồn tại) gõ: micro <filename>
• Các file design cần được khai báo trong filelist.
6
203B3 - DOE - HCMUT
7
203B3 - DOE - HCMUT
Code
Tạo file design có tên design_1.sv đặt trong src.
src/design_1.sv
1 module design_1 (
2 // input
3 input logic [2:0] data0_i,
4 input logic [2:0] data1_i,
5 input logic [1:0] sel_i,
6
7 // output
8 output logic [2:0] result_o
9 );
10
11 // local declaration
12 logic [2:0] and_tmp; // temporary for and result
13 logic [1:0] or_tmp; // temporary for or result
14 logic [2:0] xor_tmp; // temporary for xor result
15
16 assign and_tmp = data0_i & data1_i;
17 assign or_tmp = data0_i | data1_i;
18 assign xor_tmp = data0_i ~^ data1_i;
19
20 always_comb begin : proc_mux
21 case (sel_i)
22 2'b00: result_o = '0;
23 2'b01: result_o = and_tnp;
24 2'b11: result_o = or_tmp;
25 2'b11: result_o = xor_tmp;
26 endcase
27 end
28
29 endmodule : design_1
8
203B3 - DOE - HCMUT
Tại ex01, mở và thêm tên file trong filelist. Nhập micro filelist hoặc nếu đang ở trong src thì ra ngoài
ex01 bằng cách nhập cd ..
filelist
1 src/design_1.sv
Lint Check
Bước 1: Chạy Lint Check để kiểm tra lỗi, nhập make lint.
$ make lint
------------------> LINT CHECK <------------------
%Error: src/design_1.sv:23:25: Can't find definition of variable: 'and_tnp'
: ... Suggested alternative: 'and_tmp'
23 | 2'b01: result_o = and_tnp;
| ^~~~~~~
%Error: Exiting due to 1 error(s)
make: *** [makefile:50: lint] Error 1
$
Bước 2:
Sau khi chạy Lint, đoạn code trên có bug ở dòng 23, lỗi không tìm thấy and_tnp vì ở đây gõ sai, lúc khai báo là
and_tmp. Sửa lại ở dòng 23, lặp lại Bước 1, make lint.
$ make lint
------------------> LINT CHECK <------------------
%Warning-WIDTH: src/design_1.sv:17:18: Operator ASSIGNW expects 2 bits on the
Assign RHS, but Assign RHS's OR generates 3 bits.
: ... In instance design_1
17 | assign or_tmp = data0_i | data1_i;
| ^
... For warning description see
https://verilator.org/warn/WIDTH?v=4.225
... Use "/* verilator lint_off WIDTH */" and lint_on around source
to disable this message.
%Warning-WIDTH: src/design_1.sv:24:23: Operator ASSIGN expects 3 bits on the Assign
RHS, but Assign RHS's VARREF 'or_tmp' generates 2 bits.
: ... In instance design_1
24 | 2'b11: result_o = or_tmp;
| ^
%Warning-CASEOVERLAP: src/design_1.sv:25:7: Case values overlap (example pattern
9
203B3 - DOE - HCMUT
0x3)
25 | 2'b11: result_o = xor_tmp;
| ^~~~~
%Warning-CASEINCOMPLETE: src/design_1.sv:21:5: Case values incompletely covered
(example pattern 0x2)
21 | case (sel_i)
| ^~~~
%Error: Exiting due to 4 warning(s)
make: *** [makefile:50: lint] Error 1
$
1. Lỗi đầu tiên, %Warning-WIDTH: src/design_1.sv:17 → lỗi về độ dài bit không phù hợp, đọc
thêm ta thấy or_tmp là 2 bit nhưng kết quả RHS (Right Hand Side - bên phải) là 3 bit, điều này do lúc
khai báo or_tmp là 2 bit ([1:0]). → Sửa dòng khai báo or_tmp (dòng 12) thành 3 bit: [2:0]
3. Lỗi ở dòng 25, %Warning-CASEOVERLAP: src/design_1.sv:25 → lỗi về việc trùng lặp giá trị so
sánh case. Coi lại đoạn code thấy có 2 trường hợp 2’b11.
4. Lỗi ở dòng 21, %Warning-CASEINCOMPLETE: src/design_1.sv:21 → lỗi về việc thiếu giá trị so
sánh case. Lỗi này do thiếu trường hợp 2’b10. Như vậy lỗi dòng 21 và 25 liên quan tới nhau, sửa dòng
24 thành 2’b10.
$ make lint
------------------> LINT CHECK <------------------
$
10
203B3 - DOE - HCMUT
3. Verification
Set Up
Để verify thiết kế trên, cần tạo driver để lái input và đặt điều kiện ở output ứng với input cụ thể.
Các giá trị input, hay còn gọi là test transactions, được tạo ngẫu nhiên, vì thế ta không biết được chính xác giá
trị inputs nào được đưa vô và tính toán trước outputs để so sánh. Thêm nữa, việc tính toán thủ công theo cách
đó, đối với thiết kế lớn với hàng ngàn mẫu test sẽ gây khó khăn cho người thiết kế, do đó phải kiểm tra outputs
cách tự động, ở đây sử dụng assertions để kiểm tra.
Bước 1: Tạo file top.sv ở trong directory ex01, gọi file design_1.sv.
1. Khai báo input và output như trong design_1, thêm xung clock. Cứ mỗi xung clock là một test
transaction.
top.sv
1 module top (
2 // input
3 input logic clk_i,
4 input logic [2:0] data0_i,
5 input logic [2:0] data1_i,
6 input logic [1:0] sel_i ,
7 // output
8 output logic [2:0] result_o
9 );
10
2. Gọi module design_1. Lưu ý, sau dấu chấm là tên port của design, trong dấu ngoặc là tên signal/data
nối vô port đó.
top.sv
11 design_1 dut (
12 .data0_i (data0_i ),
13 .data1_i (data1_i ),
14 .sel_i (sel_i ),
15 .result_o(result_o)
16 );
17
3. Đặt điều kiện cho output. Sử dụng keyword assert để ràng buộc output như đoạn code bên dưới
theo yêu cầu của thiết kế, ví dụ: nếu sel = 2’b11, thì result phải bằng xor hai data, nếu không,
11
203B3 - DOE - HCMUT
simulation sẽ bị lỗi vì design không thỏa điều kiện assertion. Ở đây có tổng là 4 điều kiện ứng với 4 giá
trị sel.
top.sv
Bước 2: Tạo driver để lái input cách ngẫu nhiên (dễ phát hiện bug hơn đặt sẵn input và kiểm tra output, vì ngõ
ra output chỉ cần ràng buộc để kiểm tra tính đúng đắn)
1. Tạo file driver.cpp trong test: micro test/driver.cpp hoặc cd test rồi micro driver.cpp
test/driver.cpp
1 #define MAX_SIM 20
2
3 void set_random(Vtop *dut, vluint64_t sim_unit) {
4 dut->data0_i = rand()%8;
5 dut->data1_i = rand()%8;
6 dut->sel_i = rand()%4;
7 }
2. Lưu ý đầu tiên, input gồm data0_i, data1_i, và sel_i, nhưng cần để dưới dạng dut->data0_i, …
clk_i thì luôn được cấp cách tự động, cho nên top.sv luôn luôn phải có input logic clk_i
3. Lưu ý thứ nhì, đây là file C++, để tạo random, sử dụng hàm rand(), chia lấy dư cho 4 vì sel_i chỉ có
2 bits, còn data có 3 bits nên chia lấy dư cho 8. Nếu muốn giữ giá trị cố định, ví dụ như data0_i là
3’b101, chỉ cần gán dut->data0_i = 0b101 (Cách gán của C++).
4. Lưu ý cuối, MAX_SIM là số mẫu ngẫu nhiên được tạo.
12
203B3 - DOE - HCMUT
Simulating
Bước 1: Chạy Simulating để kiểm tra lỗi, nhập make sim.
$ make sim
-------------------> BUILD <----------------------
...
...
...
-----------------> SIMULATING <-------------------
[0] %Error: top.sv:26: Assertion failed in TOP.top.proc_assertions: 'assert'
failed.
%Error: top.sv:26: Verilog $stop
Aborting...
make: *** [makefile:61: sim] Aborted (core dumped)
$
Đọc lỗi thấy Assertion failed ở dòng 26 của top.sv, kiểm tra dòng 26 thấy assertion này ràng buộc ngõ ra
của sel = 2’b11, chứng tỏ design_1.sv sai khi sel = 2’b11.
Bước 2: Mở waveform để quan sát, nhập make wave. Chọn top → Chọn tất cả tín hiệu trong ô dưới → Chọn
Insert. Output là 001 thay vì 110.
Có thể mở menu và lưu việc chọn tín hiệu này: File → Write Save File
13
203B3 - DOE - HCMUT
src/design_1.sv
$ make sim
-------------------> BUILD <----------------------
...
...
...
-----------------> SIMULATING <-------------------
$
Không có lỗi. Lặp lại Bước 2, quan sát waveform: make wave.
$ make wave
-----------------> WAVEFORMS <--------------------
14
203B3 - DOE - HCMUT
4. Implementation
Set Up
Bước 1: Tạo file wrapper.sv.
File wrapper sẽ gọi design_1 giống như top.sv, tuy nhiên input và output sẽ lấy từ file sau
https://www.terasic.com.tw/cgi-bin/page/archive.pl?CategoryNo=53&No=30&PartNo=4
input có data0_i, data1_i, và sel_i, sử dụng switches để làm input, tên pin như bảng 4.1 trong file trên.
Tổng cộng có 8 bits, gán data0_i là SW 2, 1, và 0, data1_i là SW 5, 4, và 3, còn sel_i là SW 7 và 6. Vậy
input sẽ khai báo như dòng 3 và gán như 3 dòng 9, 10, 11.
Output chỉ có result_o và có 3 bits, sử dụng làm output, bảng 4.3 trong file trên có nhắc tới led. Chọn led
màu đỏ LEDR 2, 1, và 0. Vậy output sẽ khai báo như dòng 5 và gán như dòng 12.
quartus/wrapper.sv
1 module wrapper (
2 // input
3 input logic [7:0] SW,
4 // output
5 output logic [2:0] LEDR
6 );
7
8 design_1 dut (
9 .data0_i (SW[2:0] ),
10 .data1_i (SW[5:3] ),
11 .sel_i (SW[7:6] ),
12 .result_o(LEDR[2:0])
13 );
14
15 endmodule : wrapper
15
203B3 - DOE - HCMUT
1. Mở Quartus.
2. Chọn File → New Project Wizard.
a. Dẫn tới directory quartus trong ex01.
b. Đặt tên project là wrapper. Vì project thực tế là thư mục ex01, nên cần đặt tên đúng như tên
file nối pin là file wrapper.sv.
c. Next để đi tiếp.
16
203B3 - DOE - HCMUT
Bước 4: Compilation
17
203B3 - DOE - HCMUT
Kiểm tra cửa sổ thông báo không có errors → tiến hành nạp lên KIT.
18
203B3 - DOE - HCMUT
Nạp KIT
1. Kết nối DE2 bằng dây USB ở cổng Blaster
19
203B3 - DOE - HCMUT
3. Kiểm tra đã kết nối chưa: USB-Blaster X, nếu hiện No Hardware, nhấn Hardware Setup và chọn
USB-Blaster X → Close
4. Chọn Start để tiến hành nạp. Kiểm tra ở ô Progress là 100% (successful) tức là đã nạp thành công.
20
203B3 - DOE - HCMUT
1. Problem
Thiết kế mạch đếm số lần nhấn nút bấm, nếu nhấn giữ vẫn tính là một lần nhấn, hiện ra led 7 đoạn số lần nhấn.
Thiết kế có một ngõ vào là nút nhấn (button - 1 bit) và một ngõ ra led 7 đoạn (led - 7 bit). Xét mạch này là mạch
tuần tự nên cần có clock và reset (chọn active low).
- Mạch nhận nút nhấn (button): nếu nhấn giữ, chỉ tạo ra tín hiệu trong 1 cycle.
- Mạch đếm (counter): mạch đếm lên khi ngõ vô bằng 1, giới hạn là 9.
- Mạch giải mã led 7 đoạn (hexled): nhận ngõ ra counter là data 4 bit chuyển thành data lái led 7 đoạn.
Mạch button được hiểu như là một FSM với 3 trạng thái: IDLE (chờ nhận), PRESS (khi nhấn nút trong cycle
đầu), HOLD (khi vẫn còn nhấn).
21
203B3 - DOE - HCMUT
2. Design
Tạo Project
Source template từ GitHub để sử dụng, đặt tên là ex02
gettemplate ex02
Code
1. Tạo file design có tên button.sv.
src/button.sv
1 module button (
2 // input
3 input logic clk_i,
4 input logic rst_ni,
5
6 input logic button_i,
7
8 // output
9 output logic stable_o
10 );
11
12 // local declaration
13 typedef enum logic [1:0] {
14 IDLE,
15 PRESS,
16 HOLD
17 } state_e;
22
203B3 - DOE - HCMUT
18
19 state_e state_d;
20 state_e state_q;
21
22 always_comb begin : proc_next_state
23 case (state_q)
24 IDLE: state_d = button_i ? PRESS : IDLE;
25 PRESS: state_d = button_i ? PRESS : IDLE;
26 HOLD: state_d = button_i ? HOLD : IDLE;
27 default: state_d = IDLE;
28 endcase
29 end
30
31 always_ff @(posedge clk_i) begin : proc_state_register
32 if (!rst_ni)
33 state_q <= IDLE;
34 else
35 state_q <= state_d;
36 end
37
38 // output combinational logic
39 assign stable_o = (state_q == PRESS) ? 1'b1 : 1'b0;
40
41 endmodule : button
src/counter.sv
1 module counter (
2 // input
3 input logic clk_i,
4 input logic rst_ni,
5
6 input logic inc_i,
7
8 // output
9 output logic [3:0] counter_o
10 );
11
12 always_ff @(posedge clk_i) begin : proc_counter
13 if (!rst_ni)
14 counter_o <= '0;
15 else begin
16 if ((counter_o < 4'h9) && inc_i)
17 counter_o <= counter_o + 4'h1;
18 end
23
203B3 - DOE - HCMUT
19 end
20
21 endmodule : counter
src/hexled.sv
1 module hexled (
2 // input
3 input logic [3:0] data_i,
4
5 // output
6 output logic [6:0] hex_o
7 );
8
9 always_comb begin : proc_7seg_decoder
10 case (data_i)
11 4'h0: hex_o = 7'b100_0000;
12 4'h1: hex_o = 7'b111_1001;
13 4'h2: hex_o = 7'b010_0100;
14 4'h3: hex_o = 7'b011_0000;
15 4'h4: hex_o = 7'b001_1001;
16 4'h5: hex_o = 7'b001_0010;
17 4'h6: hex_o = 7'b000_0010;
18 4'h7: hex_o = 7'b101_1000;
19 4'h8: hex_o = 7'b000_0000;
20 4'h9: hex_o = 7'b001_1000;
21 4'ha: hex_o = 7'b000_1000;
22 4'hb: hex_o = 7'b000_0011;
23 4'hc: hex_o = 7'b100_0110;
24 4'hd: hex_o = 7'b010_0001;
25 4'he: hex_o = 7'b000_0110;
26 4'hf: hex_o = 7'b000_1110;
27 endcase
28 end
29
30 endmodule : hexled
src/design_2.sv
1 module design_2 (
2 // input
3 input logic clk_i,
4 input logic rst_ni,
24
203B3 - DOE - HCMUT
5
6 input logic button_i,
7
8 // output
9 output logic [6:0] led_o
10 );
11
12 // local declaration
13 logic inc;
14 logic [3:0] counter;
15
16 button button0 (
17 .clk_i (clk_i ),
18 .rst_ni (rst_ni ),
19 .button_i(button_i),
20 .stable_o(inc )
21 );
22
23 counter counter0 (
24 .clk_i (clk_i ),
25 .rst_ni (rst_ni ),
26 .inc_i (inc ),
27 .counter_o(counter)
28 );
29
30 hexled hexled0 (
31 .data_i(counter),
32 .hex_o (led_o)
33 );
34
35 `ifdef VERILATOR
36 /*verilator lint_off UNUSED*/
37 logic pastvld;
38 always @(posedge clk_i) begin
39 pastvld <= 1'b1;
40
41 if (pastvld && $past(inc))
42 assert(!inc);
43
44 assert(counter <= 4'h9);
45 end
46 /*verilator lint_on UNUSED*/
47 `endif
48
49 endmodule : design_2
25
203B3 - DOE - HCMUT
Lưu ý, ở bài trước do mạch không có clock, nhưng assertion thì yêu cầu có clock cho nên phải tạo assertions
trong file top.sv. Còn với ví dụ này thì có clock và ràng buộc outputs bao gồm outputs của button và
counter, nên assertions cần đặt ở trong design_2.sv, như vậy có thể đặt ràng buộc cho ngõ ra của button –
với 1 lần nhấn chỉ lái output lên 1 trong 1 cycle, tức là output của button không thể bằng 1 trong 2 cycles liên tiếp
(dòng 42) – và counter – chỉ đếm từ 0 tới 9 (dòng 44).
Ở đây có thêm tín hiệu pastvld, bởi vì để sử dụng được $past để lấy giá trị tại cycle trước đó thì giá trị đó cần
phải valid.
Vì pastvld là tín hiệu cho verification, và các assert cũng vậy, cần bỏ qua lúc đổ lên KIT, nên đặt những
dòng đó trong khối sau:
35 `ifdef VERILATOR
36 /*verilator lint_off UNUSED*/
.. ...
Vậy, khi chạy Lint Check, phần cho verification này sẽ bị bỏ qua, và khi chạy Quartus để đổ lên KIT cũng vậy.
filelist
1 src/button.sv
2 src/counter.sv
3 src/hexled.sv
4 src/design_2.sv
top.sv
1 module top (
2 // input
3 input logic clk_i,
4 input logic rst_ni,
5
6 input logic button_i,
7
8 // output
9 output logic [6:0] led_o
10 );
26
203B3 - DOE - HCMUT
11
12 design_2 dut (
13 .clk_i (clk_i ),
14 .rst_ni (rst_ni ),
15 .button_i(button_i),
16 .led_o (led_o )
17 );
18
19 endmodule : top
test/driver.cpp
27
203B3 - DOE - HCMUT
→ Debug
28
203B3 - DOE - HCMUT
Khuyến khích sửa thêm một vài chỗ trong 2 modules button và counter để biết được khi có bug thì đọc
WARNING và ERROR ra sao để có thể debug.
29
203B3 - DOE - HCMUT
5. Implementation
Bước 1: Tạo file wrapper.sv.
input có button_i, và rst_ni, sử dụng nút nhấn key để làm input, tên pin như bảng 4.2 trong DE2 Manual
(coi lại ví dụ trước). Tổng cộng có 2 bits, gán button_i là KEY 2, rst_ni là KEY 0. Vậy input sẽ khai báo như
dòng 4 và gán như 2 dòng 12 và 13. Vì DE2 khi không nhấn là 1, cho nên cần đảo lại input của button_i, còn
rst_ni là tích cực thấp nên không cần.
Đối với clock, bảng 4.5 có liệt kê các pin clock của DE2, chọn clock 50MHz, khai báo như dòng 3, nối dây như
dòng 10.
Output chỉ có led_o là led 7 đoạn gồm 7 bits, bảng 4.4 trong file là về led 7 đoạn. Chọn led 7 đoạn số 0, HEX0,
vậy output sẽ khai báo như dòng 7 và gán như dòng 14.
quartus/wrapper.sv
1 module wrapper (
2 // input
3 input logic CLOCK_50,
4 input logic [2:0] KEY,
5
6 // output
7 output logic [6:0] HEX0
8 );
9
10 design_2 dut (
11 .clk_i (CLOCK_50),
12 .rst_ni (KEY[0] ),
13 .button_i(~KEY[2] ),
14 .led_o (HEX0 )
15 );
16
17 endmodule : wrapper
Bước 4: Compilation.
30
203B3 - DOE - HCMUT
Phụ Lục
Download Tools
Đối với Windows 11, sinh viên cần cài đặt WSL2 Kernel:
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
31
203B3 - DOE - HCMUT
e. Đặt username, password và nhập lại password, lưu ý: password sẽ KHÔNG hiện ra màn hình.
f. Để tìm Directory làm việc trong Ubuntu nằm ở đâu trong Windows,
nhập command cd ~; explorer.exe . . Ra ngoài thư mục home, chuột phải thư mục có tên
username dã đặt và chọn Pin to Quick Access. Những files và directory được tạo trong Ubuntu sẽ có ở
đây.
32
203B3 - DOE - HCMUT
https://drive.google.com/file/d/1F2aKS83WR8D6xWmu1k4xSWetmcbcmeue/view?usp=sharing
Nếu làm đúng các bước trên, mở lại Ubuntu, gõ ký tự “ls” (tức là list - liệt kê các files có trong directory) thì sẽ
hiện ra file: install203.tar
Cài đặt
33
203B3 - DOE - HCMUT
2. Linux
Trước dấu $ cho biết thư mục hiện tại, khi nhập command, nó sẽ xuất hiện sau dấu $.
Basic Commands
ls List (liệt kê) files trong thư mục
34
203B3 - DOE - HCMUT
cp file1.sv file2.sv Copy file1.sv vô thư mục hiện tại và đặt tên là file2.sv
cp file1.sv abc/file3.sv Copy file1.sv vô thư mục abc và đặt tên là file3.sv
mv abc/file3.sv . Move file3.sv trong thư mục abc ra thư mục hiện tại
rm file2.sv xyz/file1.sv Remove (xoá) file2.sv và file1.sv trong thư mục xyz
Nên gõ những command này theo thứ tự trên, mỗi lần nhập xong nhớ nhập ls hoặc tree, và pwd cho hiểu cách
hoạt động.
Micro: Alt+G để biết các phím tắt, ví dụ “^S Save” có nghĩa là để Save, nhấn Ctrl+S.
35
203B3 - DOE - HCMUT
Bước 2: Giải nén file cài đặt. (có thể sử dụng 7zip https://www.7-zip.org/a/7z2201-x64.exe )
Bước 3: Mở file trong thư mục vừa giải nén với quyền Admin.
Bước 4: (Tùy chọn) Khi tới phần chọn components, chỉ cần chọn Cyclone là đủ cho DE2 và DE10.
36
203B3 - DOE - HCMUT
1. Cấp nguồn cho KIT, gắn dây USB vô cổng USB Blaster, đầu USB-A cắm vô laptop.
2. Windows + S → Tìm Device Manager.
3. Ở phần Other devices → click chuột phải USB-Blaster → Update driver
37
203B3 - DOE - HCMUT
6. Sau khi cài đặt thành công, màn hình này sẽ xuất hiện
38