해결된 질문
작성
·
172
1
안녕하세요, 정성이 느껴지는 강의를 제공해 주심에 감사드립니다.
컴퓨터 구조의 메모리 계층 구조와 Verilog로 SRAM 모델링하기 강의에서 궁금증이 생겨 질문 드립니다.
ASIC 칩을 찍어내는 상황이라는 가정을 하고, SRAM의 DEPTH를 2의 지수가 아닌 수(예를 들면 1021)로 지정하면, 실제 칩에는 DEPTH가 1021인 SRAM이 올라가나요? 아니면 1024짜리 SRAM이 올라가나요? 파운드리마다 다른가요?
실제 ASIC 칩에 DEPTH가 1021인 SRAM이 올라간다고 가정한다면, 주소의 bitwidth는 10-bit이므로 1022번이나 1023번 주소처럼 잘못된 주소에 접근할 가능성이 있습니다. 그렇기 때문에 이를 막는 로직이 추가로 필요할 것이라고 생각이 드는데, 이때 발생하는 overhead를 고려하는 것과 그냥 DEPTH가 1024인 SRAM을 올려버리는 것을 PPA 관점으로 비교할 수 있는 방법이 있을까요?
3.parameter로 선언된 변수를 비교 대상으로 삼아도 ASIC에서 아무 문제 없나요? 가령, if (addr > DEPTH) 처럼요!
답변 1
0
안녕하세요, 답변 남겨드립니다.
1. ASIC 칩을 찍어내는 상황이라는 가정을 하고, SRAM의 DEPTH를 2의 지수가 아닌 수(예를 들면 1021)로 지정하면, 실제 칩에는 DEPTH가 1021인 SRAM이 올라가나요? 아니면 1024짜리 SRAM이 올라가나요? 파운드리마다 다른가요?
-> 이런 부분은 굉장히 현업적인 부분 중에서도 휴먼 에러에 대한 필터 시스템에 대한 이야기라고 볼 수 있는데요,
이것은 회사에 따라 다릅니다.
툴 자체에서는 필터를 하는 기능이 없기 때문에 일반적으로는 1021 DEPTH 그대로 합성이 진행될 것입니다. 그런데 그렇게 합성된다고 하더라도 Auto P&R을 하기 전에 pre-layout 단계에서 검증(DV)을 진행하게 될텐데, 1024 DEPTH를 가정한 다양한 시뮬레이션과 분석이 진행될 것이고, 여기에서 막힐 것입니다.
따라서 툴에서는 필터가 없지만, 제대로 된 검증 프로세스만 갖고 있는 회사라면 여기에서 시스템적으로 거를 수 있게 됩니다. 파운드리까지 가기 전에 충분이 필터가 되는 것이며, 파운드리에서는 1024로 공정이 진행될 것입니다.
2. 실제 ASIC 칩에 DEPTH가 1021인 SRAM이 올라간다고 가정한다면, 주소의 bitwidth는 10-bit이므로 1022번이나 1023번 주소처럼 잘못된 주소에 접근할 가능성이 있습니다. 그렇기 때문에 이를 막는 로직이 추가로 필요할 것이라고 생각이 드는데, 이때 발생하는 overhead를 고려하는 것과 그냥 DEPTH가 1024인 SRAM을 올려버리는 것을 PPA 관점으로 비교할 수 있는 방법이 있을까요?
-> 또한 합성 전 단계에서 말씀하신 것처럼 로직을 추가로 만들어서 필터를 하는 방법도 있을것입니다. 그렇게 되면 그런데 Area를 추가 소모하게 되죠. 따라서 애초에 합성 전 부터 이를 필터하여 합성되지 않게 하고, 그에 대한 추가 로직이 발생하지 않도록 하는 것이 중요한데요,
System Verilog에서 보시면 assertion 이라는 구분이 있습니다. 이 구분을 통해서 로직 합성 전 Functional Verification 단계에서 적절하게 조건을 만들어 2의 제곱에 해당하는 만큼의 출력을 설정하여 don't care가 뜨거나 High-z가 뜨는 신호에 대해서 assertion을 띄워서 문제를 확인할 수 있게끔 구성해두면 어지간해서는 발견하여 합성 전 문제 차단이 가능합니다.
3. parameter로 선언된 변수를 비교 대상으로 삼아도 ASIC에서 아무 문제 없나요? 가령, if (addr > DEPTH) 처럼요!
->
Verilog에서 `parameter`로 선언된 변수를 비교하는 것은 ASIC 설계에서 일반적으로 허용되며, 문제가 발생하지 않습니다. `parameter`는 컴파일 타임에 상수로 평가되므로, 이러한 비교는 하드웨어 생성 시점에 결정됩니다.
예를 들어, 다음과 같이 `parameter`를 정의하고 이를 비교하는 코드는 정상적으로 작동합니다:
```verilog
parameter DEPTH = 256;
always @(*) begin
if (addr > DEPTH) begin
// addr가 DEPTH보다 클 때의 동작
end
end
```
이 코드에서 `DEPTH`는 상수로 평가되며, `addr`과 비교하여 조건문을 실행하는 데 문제가 없습니다. ASIC 설계에서는 이러한 비교가 하드웨어 로직으로 변환되므로, 최적화 과정에서도 적절하게 처리됩니다.
다만, 몇 가지 주의할 점이 있습니다:
1. 비교 대상의 비트너리 크기: `addr`과 `DEPTH`의 비트너리 크기가 다를 경우, 비트 확장이나 자르기가 필요할 수 있습니다. 이로 인해 예기치 않은 동작이 발생할 수 있으므로, 비트 크기를 일치시키는 것이 중요합니다.
2. 시뮬레이션과 합성의 일관성: 시뮬레이션 환경에서의 동작과 합성된 하드웨어의 동작이 일치하는지 확인해야 합니다. 특정 조건에서 시뮬레이션과 합성 결과가 다를 수 있으므로, 반드시 검증이 필요합니다.
이러한 점들을 유의하면, `parameter`를 이용한 비교는 ASIC 설계에서 안전하게 사용할 수 있습니다.
상세한 답변에 감사드립니다.