---
license: apache-2.0
base_model:
- Qwen/Qwen3.6-27B
pipeline_tag: text-generation
library_name: transformers
tags:
- code
- rtl
- verilog
- gpu-kernel
- triton
---
iCoder-27B is a 27B-parameter model for industrial coding, covering RTL design
and GPU kernel optimization.
It is the product of an experiment in delegating model development itself.
Human experts encoded their model-development experience once, as reusable
Research Skills. From that point on an agent instantiated those Skills,
allocated resources, ran and diagnosed experiments, and revised the training
strategy. The agent coordinated a multi-stage pipeline spanning supervised
fine-tuning, on-policy self-distillation, and reinforcement learning with
verifiable rewards, in which every reward comes from compiling and running the
model's own output rather than from comparison against a reference text.

Despite its compact scale, iCoder-27B surpasses models with up to 59x more
total parameters, including DeepSeek-V4-Pro, GLM-5.2 and Kimi-K2.6. It leads on
RTLLM (68.0), ties Claude Opus 4.8 for the best TritonBench-G pass@1 (20.1),
and ranks second on KernelBench L2 Fast and on CVDP. Its 61% KernelBench L1
correctness is the highest of any model evaluated.
The full technical report describing the recipe is available
[here](Coder_Tech_Report.pdf).
## Results

Every model is evaluated through the same harness. RTL benchmarks run under the
simulator each official suite specifies; kernel benchmarks compare candidate
outputs against the reference implementation under matched inputs. **Bold**
marks the best result in each row and *italic* the second best.
| Benchmark | Metric | iCoder-27B | Qwen3.6-27B | InCoder-32B | InCoder-32B-T | DeepSeek-V4-Pro | GLM-5.2 | Kimi-K2.6 | GPT-5.5 | Claude-Opus-4.8 | Hy3 | Gemini-3.5-Flash |
|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| VerilogEval | Spec-to-RTL avg@4 | 86.3 | 70.1 | 62.5 | 65.9 | 69.9 | 66.0 | 72.4 | **90.1** | 82.7 | 83.8 | *89.1* |
| VerilogEval | Code-complete avg@4 | *86.0* | 70.8 | 58.2 | 54.2 | 79.8 | 74.8 | 78.5 | **91.4** | 81.9 | 81.6 | 83.8 |
| RTLLM | Functional avg@4 | **68.0** | 49.6 | 48.0 | 44.2 | *67.5* | 64.0 | 59.0 | 66.0 | 64.7 | 53.5 | 63.5 |
| CVDP | Functional avg@5 (%) | *44.1* | 33.9 | 36.9 | 30.3 | 38.5 | 39.5 | 42.1 | 39.5 | **47.7** | 39.7 | 29.7 |
| RealBench | Syntax pass@5 (%) | 61.7 | 38.3 | 60.0 | 55.0 | 36.7 | 43.3 | 58.3 | *80.0* | **83.3** | 41.7 | 68.3 |
| RealBench | Functional pass@5 (%) | 26.7 | 16.7 | **46.7** | *36.7* | 16.7 | 25.0 | 25.0 | 28.3 | *36.7* | 16.7 | 26.7 |
| ArchXBench | Functional pass@1 (%) | 49.3 | 35.2 | 36.6 | 29.6 | 50.7 | 50.7 | 42.3 | **56.3** | *54.9* | 47.9 | 50.7 |
| KernelBench L1 | Compiled (%) | 95 | 87 | 88 | 85 | 93 | *96* | 93 | **98** | 95 | 94 | 94 |
| KernelBench L1 | Correct (%) | **61** | 32 | 51 | 47 | 32 | 50 | 32 | 43 | *55* | 42 | 45 |
| KernelBench L1 | Fast (%) | 25 | 12 | 18 | 18 | 13 | *26* | 5 | 22 | **30** | 21 | 23 |
| KernelBench L2 | Compiled (%) | 97 | 89 | 90 | 93 | 91 | 98 | 84 | **100** | 97 | 98 | *99* |
| KernelBench L2 | Correct (%) | *74* | 28 | 65 | 63 | 40 | 40 | 17 | 41 | 70 | 56 | **78** |
| KernelBench L2 | Fast (%) | *40* | 17 | 14 | 15 | 25 | 30 | 7 | 24 | 37 | 29 | **47** |
| KernelBench L3 | Compiled (%) | 90 | 86 | 60 | 60 | 86 | 90 | 82 | **100** | 84 | *98* | **100** |
| KernelBench L3 | Correct (%) | 34 | 12 | 30 | 20 | 4 | 30 | 18 | 38 | *40* | 18 | **58** |
| KernelBench L3 | Fast (%) | 10 | 4 | **14** | *12* | 2 | 0 | 0 | 6 | 8 | 2 | **14** |
| TritonBench-G | Correctness pass@1 (%) | **20.1** | 11.4 | 17.9 | 18.5 | 19.0 | 19.0 | 19.0 | *19.5* | **20.1** | *19.5* | 14.9 |
## Usage
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "i-Coder/iCoder-27B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id, dtype="auto", device_map="auto"
)
messages = [{"role": "user", "content": "Write a 4-bit synchronous up counter with active-low reset in Verilog."}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer([text], return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=2048)
print(tokenizer.decode(out[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True))
```
## Citation
If you find iCoder useful in your work, please cite the technical report:
```bibtex
@techreport{yang2026icoder,
title = {iCoder-27B: Recursive AI-Led Development of Frontier Industrial Coding Model},
author = {Cheng Yang and Jiayang Lyu and Shangyuan Liu and Guibin Zhang and
Jiong Lin and Xinlei Yu and Junchi Yan and Shuicheng Yan and
Weinan E and Linfeng Zhang and Linfeng Zhang and Qibing Ren},
year = {2026},
month = aug,
type = {Technical Report},
url = {https://huggingface.co/i-Coder/iCoder-27B}
}
```
## License
Apache-2.0, inherited from the base model, Qwen3.6-27B.