SoC 설계/Verilog, SystemVerilog 16

Glitch free selection in Clock Mux

Clock Mux의 sel 신호에 Glitch 발생 시 문제점 및 해결 방법Clock Mux(clk_mux)는 두 개 이상의 클럭 신호 중 하나를 선택하는 역할을 합니다. 그러나 sel 신호에 글리치(Glitch)가 발생하면 예기치 않은 클럭 전환, 메타스테빌리티, 타이밍 위반 등의 문제가 발생할 수 있습니다.문제점 (Issues)1. Glitch로 인한 짧은 Clock Pulse 발생sel 신호가 글리치로 인해 빠르게 변하면, Clock Mux의 출력이 순간적으로 잘못된 클럭을 선택할 수 있습니다.이로 인해 짧은 클럭 펄스(Glitch Clock Pulse)가 생성되어, 플립플롭(FF)이 비정상적인 동작을 하거나 타이밍 위반을 유발할 수 있습니다.2. Metastability (메타스테빌리티)sel 신..

Glitch free enable for clock gating

Clock Gating Cell의 Enable이 Glitch하면 발생하는 문제점Clock Gating Cell의 enable 신호에 글리치(Glitch)가 발생하면 심각한 타이밍 문제와 기능적 오류가 발생할 수 있습니다.주요 문제점1. Clock Glitch (잘못된 클럭 펄스)enable 신호가 글리치가 발생하면, 의도하지 않은 짧은 클럭 펄스가 생성될 수 있습니다.이러한 펄스가 플립플롭(FF)으로 전달되면, 데이터 손실 또는 타이밍 위반을 유발할 수 있습니다.2. Metastability & Setup/Hold Time Violationenable 신호가 비동기 신호이거나 클럭 엣지와 정확히 정렬되지 않으면, 클럭 게이팅 셀 내부의 래치가 메타스테이블(Metastable) 상태에 빠질 수 있습니다.결..

Verilog/Systemverilog에서 real 과 integer 간 형변환

Verilog에서 real과 integer 형 변환Verilog는 SystemVerilog와 달리 형 변환 연산자가 없기 때문에, Verilog에서 real 타입과 integer 타입 간 변환은 명시적 할당을 통해 수행됩니다.1. real to integer 변환real 값을 integer로 변환할 때 소수점 이하 값이 잘립니다(버림).module real_to_integer; real real_value; integer int_value; initial begin real_value = 1.23; int_value = real_value; // 암시적 변환 $display("Real to Integer: %f -> %d", real_value, in..

배열 시스템 함수들

Array system functions SystemVerilog는 배열의 크기를 직접 선언하지 않은 채, 배열을 쉽게 조작할 수 있는 여러 특수한 시스템 함수들을 제공합니다. 합성 가능한 배열 쿼리 함수들에는 $left(), $right(), $low(), $high(), $increment(), $size(), $dimensions(), 및 $unpacked_dimensions() 이 있습니다. 다음은 이러한 함수 중 일부를 사용하는 예입니다: typedef logic [31:0] d_array_t [0:4][0:4]; function d_array_t filter ( input d_array_t d ); for (int i = $low(d,1); i

SystemVerilog: Procedural blocks

SystemVerilog는 기존의 Verilog에 아주 많은 프로그래밍 능력을 추가했다. 이러한 향상을 의도한 목적은 다음 3가지로 볼 수 있다. 코드 간결화 설계시 기능적 결함 줄이기 시뮬레이션과 합성이 동일하게 동작하도록 만들기 Procedural blocks 기존의 Verilog에서는 always문을 사용하여, combinational, latch 와 sequential logic을 생성하였다. 여기서 문제는 합성 툴과 시뮬레이션 툴이 설계자의 어떤 종류의 logic을 표현할려고 헀는지 알 방법이 없다는 것이었다. 이러한 툴들은 procedural block안에 있는 코드를 해석할 수 있었고, 설계자의 의도를 nice한 방식으로 추측하는 것 뿐이었다. combinational logic에서 간단한 ..

SystemVerilog: Casting

SystemVerilog는 Verilog에 cast 연산자를 추가했다: ’() cast 연산자는 3가지 type이 있고, 모두 synthesizable하다. Type casing: sum = int’(r * 3.141592); Size casting: sum = 16’( a+ 5); Sign casting: sum = signed’(a) + signed’(b); casting의 한가지 좋은 사용예로 lint checker에서 size mismatch warning message를 제거할 수 있다. 다음은 a를 b만큼 right rotate하는 합성 가능한 코드이다. logic [31:0] a, y; logic [5:0] b; always_comb y = {a,a} >> b; // rotate a by b..

SystemVerilog: Parameterized task/functions

파라미터 형 모듈은 Verilog에서 매우 강력하고 많이 사용된다. 파라미터들은 각 모듈의 인스턴스를 생성할때 다시 설정할 수 있어서, 그 모듈을 configurable하고, reusable하게 만든다. 기본적인 Verilog는 argument의 size와 type은 parameterized할 수 없어서, configurable하고 reusable하게 작성하는데 제한이 있었다. SystemVerilog는 이런 제약을 해결하는 방법을 제공한다. 그 방법은 parameterized class안에 static tasks나 functions을 사용하는 것이다. task나 function이 호출될때마다, 그 class parameters가 redefine된다. virtual class Functions #(par..