A Novel HDL Code Generator for Effectively Testing FPGA Logic Synthesis Compilers
Abstract
Field Programmable Gate Array (FPGA) logic synthesis compilers (e.g., Vivado, Iverilog, Yosys, and Quartus) are widely applied in Electronic Design Automation (EDA), such as the development of FPGA programs. However, defects (i.e., incorrect synthesis) in logic synthesis compilers may lead to unexpected behaviors in target applications, posing security risks. Therefore, it is crucial to thoroughly test logic synthesis compilers to eliminate such defects. Despite several Hardware Design Language (HDL) code generators (e.g., Verismith) have been proposed to find defects in logic synthesis compilers, the effectiveness of these generators is still limited by the simple code generation strategy and the monogeneity of the generated HDL code. This paper proposes LegoHDL, a novel method to generate syntax valid HDL code for comprehensively testing FPGA logic synthesis compilers. LegoHDL can generate more complex and diverse defect-trigger HDL code (e.g., Verilog, VHDL, and SystemVerilog) by leveraging the guidance of abstract syntax tree and the extensive function block libraries of cyber-physical systems. Extensive experiments show that the diversity and defect-trigger capability of HDL code generated by LegoHDL are significantly better than the state-of-the-art method (i.e., Verismith). In three months, LegoHDL has reported 20 new defects–many of which are deep and important; 16 of them have been confirmed.
Index Terms:
FPGA, Logic Synthesis Compiler, Defects DetectionI Introduction
Field Programmable Gate Array (FPGA) logic synthesis compilers (e.g., Vivado, Iverilog, Yosys, and Quartus) are indispensable in the field of digital design and engineering, serving as the bridge between theoretical hardware models and implementable digital circuits [1, 2, 3]. Engineers use FPGA logic synthesis compilers to translate high-level descriptions of hardware functionality, expressed in HDLs such as Verilog, into gate-level representations that can be physically implemented on silicon chips. This process enables the design of complex Integrated Circuits (ICs), including Central Processing Units (CPUs), Graphics Processing Units (GPUs), and custom Application Specific Integrated Circuits (ASICs).
As shown in Figure 2, logic synthesis plays a critical role in hardware design development, which enables different devices (i.e., hardware) to seamlessly integrate with legacy industrial systems. This ensures that systems can be promptly updated or reconfigured as needs evolve. Such adaptability is crucial in industry, as detailed in Intel’s FPGA Industrial Solutions Playbook 2022 [4], where it illustrates that FPGA synthesis can lead to more efficient, flexible, and scalable industrial systems. However, FPGA logic synthesis compilers are prone to defects since the compilers need to implement intricate optimizations to optimize the power consumption and timing requirements of the designed FPGAs [5]. Unexpected behavior of FPGA logic synthesis compilers can impact the final circuit board design and potentially lead to significant losses.
To this end, several methods have been proposed to generate HDL code for testing logic synthesis compilers. The first method is VlogHammer [6], which uses a random strategy to generate Verilog code. However, VlogHammer [6] cannot generate HDL code containing multiple models; it also does not support behavioral-level Verilog (such as “always” blocks). Verismith [5] is then proposed and becomes the most effective generator for testing FPGA logic synthesis compilers. Verismith uses an Abstract Syntax Tree (AST)-based generation method to create HDL code. It can generate pseudo-random, valid, deterministic Verilog designs by using the created AST. Over a nearly two-year period, Verismith [5] finds 11 defects in logic synthesis compilers. However, there are still some drawbacks in Verismith [5], such as the lack of diversity and the high degree of code redundancy for the generated HDL code.
By a deep analysis of existing methods, we find that two main challenges still remain to be addressed in FPGA logic synthesis compilers testing.
Challenge 1. Control-flow and data-flow diversity limitation. To uncover deeper, more elusive defects in FPGA logic synthesis compilers, a fundamental requirement is to ensure the adequate complexity of the generated HDL code. However, existing HDL code generators, such as Verismith [5], only employ a simple random strategy to generate HDL code. The generated HDL code lacks in data-flow and control-flow complexity, thereby hindering the HDL code to comprehensively test FPGA logic synthesis compilers. Therefore, the first challenge is how to sufficiently generate HDL code with complex and diverse control-flow and data-flow to thoroughly test FPGA logic synthesis compilers.
Challenge 2. HDL code type limitation. There are currently three main HDLs commonly used to design and develop ICs or FPGA programs, namely Verilog, SystemVerilog, and VHDL. However, existing HDL code generators, like Verismith and VlogHammer, predominantly focus on generating Verilog code. Consequently, the generated HDL code cannot support SystemVerilog and VHDL, which further limits the generality of the generator. Thus, the second challenge is how to generate HDL code written in different HDLs to test various FPGA logic synthesis compilers.
In this paper, we propose a novel method, named LegoHDL to generate more complex and diverse defect-trigger HDL code for detecting defects in FPGA logic synthesis compilers. The basic idea of LegoHDL is to transform the task of HDL code generation into Cyber-Physical System (CPS) model generation. CPS model is a block-based graphical diagram that can describe the high-level design of hardware systems. These CPS models can be easily translated into HDL code by CPS model translators (such as HDLCoder in Simulink), and got deployed in the target hardware.
Specifically, LegoHDL has two components: the function generation component and the syntax guidance component. Initially, the function generation component randomly connects a set of blocks in CPS function block libraries to dynamically generate an initial CPS function model (which is similar as a module of a CPS model) from scratch. The syntax guidance component then runs the HDLCoder tool [7], which supports to translate the current CPS function model into corresponding HDL code (e.g., Verilog, VHDL, and SystemVerilog), thus addressing the HDL code type limitation challenge. After that, LegoHDL builds the AST of the generated HDL code. Based on the AST, LegoHDL randomly identifies an insertion position in the corresponding CPS function model, and collects the constraint information (e.g., data types and sampling rate) at this insertion position. LeogHDL then returns the insertion position to the function generation component to guide the subsequent CPS function model generation at this position. Through dynamic interaction between the AST and CPS function models, LegoHDL can manage the data flow and control flow in HDL code, thereby addressing the control-flow and data-flow diversity limitation. The two components continue to interact until the final HDL code and corresponding CPS model are generated, which is similar to Lego by piecing together small pieces of discrete functional component into a complete large project. Finally, the generated HDL code is used as input to test logic synthesis compilers.
To evaluate the effectiveness of LegoHDL, we ran LegoHDL to generate defect-trigger HDL code on FPGA logic synthesis compilers (i.e., Vivado, Iverilog, Yosys, and Quartus) for three months. LegoHDL detected 20 defects, 16 of which have been confirmed by official technical supports. These defects include those that cannot be detected by state-of-the-art (SOTA) method Verismith [5] (e.g., Yosys defect #1110 and Quartus defect M82156).
In summary, the main contributions of this work are:
-
•
We propose a novel HDL code generator, LegoHDL, which comprises the function generation component and the syntax guidance component to address the control- and data-flow diversity limitation and the HDL code type limitation.
-
•
Extensive experiments demonstrate that LegoHDL can generate more defect-trigger HDL code and has identified 20 defects.
-
•
We have released LegoHDL as a replication package for HDL synthesis compiler testing [8] on GitHub to facilitate future studies.
II Background and Motivation
II-A The Process of FPGA Logic Synthesis
FPGA logic synthesis compilers are integral to FPGA development, as they transform high-level design descriptions into optimized gate-level representations suitable for FPGA hardware. These compilers enable designers to focus on the algorithmic and architectural aspects of their designs, automating the conversion of abstract specifications into hardware-implementable logic circuits. By optimizing the design for speed, area, and power consumption, FPGA logic synthesis compilers significantly reduce the time-to-market and improve the efficiency of FPGA-based solutions. Furthermore, they support iterative design processes, allowing developers to refine their designs based on simulation and real-world testing feedback, ensuring optimal performance and resource utilization in the final product. A synthesis process is shown as Figure 2.
-
•
The HDL synthesis process commences with the designer authoring the HDL code, which is called Register Transfer Language (RTL) code, detailing the desired hardware functionality and architecture. This RTL code delineates the logical operations, timing, and data flow within the FPGA, ASIC, or SoC.
-
•
Upon authoring, the HDL code undergoes verification through behavioral simulation with RTL code and stimulate code, which is called a testbench file. It primarily assesses the design’s correctness by comparing it with waveform figures.
-
•
Once verified via simulation, it progresses through the logic synthesis compiler and output as a netlist. FPGA logic synthesis compilers interpret the HDL code and translate it into a gate-level representation, effectively mapping high-level descriptions to specific hardware elements, such as logic gates, flip-flops, and other foundational digital components. Simultaneously, the FPGA logic synthesis compilers optimize the design for factors including speed, area, and power consumption, while ensuring compliance with the specified constraints and requirements. They also perform checks to ensure that the design is logically sound and free of errors that could lead to functional failures.
After synthesis, the design undergoes place and route, where the physical locations of the logic elements on the FPGA, ASIC or SoC chip are determined and the interconnections are laid out. The final output of this process is a bit-stream file, which can be loaded onto the FPGA, configuring its hardware to perform the desired functions as defined by the original HDL code.
Thus, the synthesis process is crucial, as it bridges the gap between theoretical or conceptual design and the practical, physical implementation in FPGA hardware. If defects exist within the synthesis tool, they could cause unexpected behavior in the final FPGA chip, potentially leading to significant safety hazards.
II-B HDL Coder Tool
HDL Coder333https://ww2.mathworks.cn/products/hdl-coder.html is a tool developed by Simulink that allows engineers to automatically generate synthesizable VHDL and Verilog code from CPS models, which could significantly accelerate the design process for FPGA and ASIC implementations by enabling a high-level model-based design approach. By utilizing HDL Coder, engineers can focus on algorithm development and system-level design without delving into the intricacies of low-level hardware description languages. The generated HDL code is optimized for hardware implementation, ensuring efficient utilization of the target FPGA or ASIC resources.
The process of converting a CPS model into HDL code using HDL Coder involves several steps to ensure the generated code meets the requirements for synthesis and performance. Initially, the user designs and simulates the CPS system, where the model’s functionality is verified against specifications. Following this, HDL Coder performs compatibility checks on the CPS model to identify any constructs that cannot be directly translated into HDL code.
Additionally, HDL Coder offers significant advantages for digital design, notably its ability to generate HDL code in a variety of languages, including Verilog, VHDL, and SystemVerilog. This flexibility allows designers to select the language that best suits their project’s requirements. Furthermore, by leveraging a comprehensive library of CPS function blocks, HDL Coder enables the creation of more complex and sophisticated HDL code designs. This capability is crucial for developing advanced digital circuits and systems that require high levels of functionality and performance.
The developers may need to modify the model or use HDL-compatible blocks to resolve these issues. Subsequently, HDL Coder generates HDL code from the validated model. This code generation process includes optimizations such as folding, pipelining, and resource sharing to enhance performance and reduce resource consumption. The final step involves verifying the generated HDL code against the original CPS model using HDL simulators or FPGA prototyping, ensuring the hardware implementation accurately reflects the designed system behavior.
As illustrated in Figure3, a CPS function model is translated into multiple lines of HDL function code by HDL Coder. Figure3 (1) depicts a CPS model designed to track airplanes using data captured by Automatic Dependent Surveillance - Broadcast (ADS-B). This model functions as an ADS-B receiver for both HDL code generation and hardware implementation. Leveraging the diverse block library of Simulink, LegoHDL provides enhanced capabilities for generating complex HDL code. Additionally, it offers the ability to generate a practical HDL code model.
III LegoHDL Model
In this section, we initially provide a comprehensive overview of LegoHDL. Subsequently, we delve into the function generation component and syntax guidance component.
III-A Overview
As shown in Figure 4, LegoHDL has two components: function generation component and syntax guidance component. LegoHDL is a fuzzing method designed to generate complex and diverse defect-triggering HDL code for comprehensive testing of logic synthesis compilers, which could help eliminate defects in FPGA logic synthesis compilers. Utilizing the extensive model library of CPS models, LegoHDL can generate fully functional HDL code, which differs from Verismith’s approach of generating completely random, unreadable HDL code. LegoHDL is more in line with the defects encountered by actual engineers during FPGA development. The process of each component in LegoHDL is delineated in Algorithm 1. Specifically, LegoHDL comprises two components: the function generation component and the syntax guidance component (lines 1-5). The function generation component (lines 6-14) primarily selects CPS function blocks from the CPS function block library and interconnects them by the selection of probability matrices to dynamically generate diverse CPS function models, guided by the constrain information of the syntax guidance component. Next, the syntax guidance component (lines 15-21) converts these models into HDL code (like Verilog, VHDL, and SystemVerilog), integrating this with the existing code to overcome the limitation HDL code type challenge. After that, LegoHDL extracts the AST of the latest HDL code. Based on the AST, LegoHDL selects the next insertion position and feeds back the current constraint information (accessible insertion points, data types, and sampling rate, etc.) to the function generation component to guide the subsequent CPS function model generation. By dynamically coordinating between the syntax guidance and function generation components, LegoHDL efficiently manages the HDL code’s control-flow and data-flow, thus overcoming the limitations related to control and data-flow diversity. This process, resembling building with LEGO, continues between the function generation component and syntax guidance component until the final HDL code model is constructed (lines 1-5), forming a large, complete system from smaller functional units. This adaptability is crucial to generate diverse and complex defect-triggering HDL code to thoroughly exercise logic synthesis compilers.
III-B Function Generation Component
By using function generation component, LegoHDL generates CPS function models layer by layer, incorporates function blocks and connections through the selection of probability matrices and constrain information, and dynamically interacts with the syntax guidance component. It consists of two sub-steps, namely the CPS function block selection and the formal specification.
During CPS function block selection, LegoHDL selects CPS function blocks for inclusion in the CPS function block libraries based on a specific probability matrix. Throughout this process, LegoHDL selects suitable function blocks for incorporating them into the CPS function model, guided by the AST feedback from the syntax guidance component.
Throughout the formal specifications, LegoHDL adds CPS function block to the CPS function model and connects them according to the formal specifications and the guidance by the syntax guidance component. In this process, LegoHDL ensures the effectiveness and quality of the generated code through formal specifications.
III-B1 CPS Function Blocks Selection
We have collected CPS function block libraries observed in Simulink projects. By doing this LegoHDL can better leverages CPS’s extensive function block library to create diverse CPS function models and ensure a broad coverage of functionality and design patterns.
As shown in Table I, LegoHDL organizes function blocks into four groups based on functionality. After translation, these four function models can cover the essential functions of HDL: Sources and Sinks, Mathematical Operations, HDL-specific Operations, and Control Flow Operations.
The Source and Sink library is responsible for providing specific periodic inputs to the CPS model or serves as a termination point to mark the end of the CPS model’s output and display the output signal, such as Constant, Inport, In Bus Element and From Workspace.
The Mathematical Operations library includes common mathematical operations such as Abs, Add and Algebraic Constraint.
The HDL-specific Operations library provides HDL-specific operations for the model, making the translated HDL code richer and imbued with more hardware design language features, such as Bit Clear, Bit Set and Bit to Integer Converter.
The Control Flow Operations library includes Select Model Relationship blocks that can enrich the control flow of the model, such as Function-Call Subsystem, If, and If Action Subsystem.
Then, LegoHDL assigns predetermined weights to each library, and using these weights, the ”choose blocks” method selects blocks to generate CPS models. Specifically, given a probability matrix , where each element denotes the probability of transitioning from model to model , and a function that represents the sampling rate of model , the following formula ensures the selection of the next model from the current model . The conditions for selection stipulate that must be different from and must have the same sampling rate.
Equation (1) ensures that each potential has a non-zero transition probability from , while maintaining that the models are distinct and share the same sampling rate.
Class | Name | Function |
Source and Sink | Constant | Generate constant value |
From Workspace | Load signal data from workspace into CPS model | |
In Bus Element | Select input from external port | |
Inport | Create input port for subsystem or external input | |
Mathematical Operations | Abs | Output absolute value of input |
Add | Add or subtract inputs | |
Algebraic Constraint | Constrain input signal | |
Assignment | Assign values to specified elements of signal | |
Bias | Add bias to input | |
Complex to Real-Imag | Output real and imaginary parts of complex input signal | |
Divide | Divide one input by another | |
Dot Product | Generate dot product of two vectors | |
Find Nonzero Elements | Find nonzero elements in array | |
Gain | Multiply input by constant | |
Math Function | Perform mathematical function | |
MinMax | Output minimum or maximum input value | |
Trigonometric Function | Specified trigonometric function on input | |
Unary Minus | Negate input | |
Weighted Sample Time Math | Support calculations involving sample time | |
HDL Specific Operations | Bit Clear | Set specified bit of stored integer to zero |
Bit Set | Set specified bit of stored integer to one | |
Bit to Integer Converter | Map vector of bits to corresponding vector of integers | |
Bitwise Operator | Specified bitwise operation on inputs | |
Combinatorial Logic | Implement truth table | |
Compare To Constant | Determine how signal compares to specified constant | |
Compare To Zero | Determine how signal compares to zero | |
Detect Change | Detect change in signal value | |
Detect Decrease | Detect decrease in signal value | |
Detect Increase | Detect increase in signal value | |
Control-flow Operations | Function-Call Subsystem | Subsystem whose execution is controlled by external function-call input |
If | Select subsystem execution using logic similar to if-else statement | |
If Action Subsystem | Subsystem whose execution is enabled by If block | |
Model | Reference another model to create model hierarchy |
(1) |
III-B2 Formal Specifications
After selecting the appropriate CPS function block from the CPS function libraries , LegoHDL uses it as its child function block. LegoHDL is required to satisfy two formal specifications (i.e., data type formal specification and sampling rate formal specification) as illustrated in Equation (2), which could improve the success rate of CPS function model generation. The data type formal specification must belong to the range of data types supported by the CPS function model, as returned by the syntax guidance component for the generated CPS function model information. The sampling rate formal specification needs to be adjustable to align with the requirements of the generated CPS function model , eliminating any external interference. Additionally, ensures no model partakes in dependency loops; it is crucial for HDL generation. Because Combinational Loop violate the principle of synchronization design can easily produce oscillations, glitches and timing violations, making the entire system extremely unstable [9].
(2) |
Furthermore, it is essential to impose formal specifications on timing optimization to ensure that the model we generate achieves the shortest possible timing path. We have adopted two distinct methods, originating from the CPS function model and the HDL model, respectively. Initially, in the CPS function model, we minimize HDL code latency by simplifying model computations and eliminate redundant code. Subsequently, in the HDL model, we identify the critical path using AST and timing calculation formulas. The critical path represents the longest delay from input to output within a digital circuit. In the design of high-performance circuits and systems, the critical path dictates the maximum operating frequency. The mathematical representation of the critical path delay in digital circuits is expressed as,
(3) |
where denotes the critical path delay. The function calculates the total propagation delay for each path from an input to an output in the circuit. The function is employed to identify the maximum value among all the calculated path delays. This maximum delay, which is the longest delay, sets the upper limit on the operational speed of the circuit and determines its maximum clock frequency. By identifying and optimizing critical paths, we effectively reduce latency and enhance the quality of generated HDL code. Furthermore, it can help us comprehensively test synthesis compilers. Finally, throughout the HDL Coder generation process, we explore various optimization levels, compare them, and determine the HDL code with the optimal timing relationship, employing strategies like pipelining optimization [10].
In addition, LegoHDL can improve the conversion efficiency of CPS functional model to HDL code and the quality of generated HDL code by combining different optimization strategies. Equation (4) determines the process of optimal optimization strategy choosing. represents the performance metric for legacy mode, and denotes the performance at level , where ranges from 0 to . The function is utilized to select the strategy that maximizes the performance, comparing the legacy mode with each level of the new optimization strategies. The final output, , indicates the strategy with the highest performance.
(4) |
Through these formal specifications, the generated CPS function models by LegoHDL have higher success rate and better test performance.
III-C Syntax Guidance Component
The syntax guidance component transforms the CPS functional model into the corresponding HDL code and adds it to the existing HDL code model, which is similar to LEGO by piecing together small pieces of discrete functional component into a complete large project. Then, we perform AST builds on the updated HDL code model to parse the logical relationships and hierarchies in the code, which lays the groundwork for further analysis and optimization by LegoHDL. After extracting the AST, LegoHDL will select the appropriate next-level insertion point and feedback the constrain information to the function generation component. Specifically, we are guided by follow three principles when selecting insertion points.
Data Dependency Rule. As illustrated in Equation (5), this rule states that for any nodes and and any variable , if is used at node , then must have been defined at some node where is less than . Here, indicates that is defined at node , and indicates that is used at node .
(5) |
Control Flow Rule. As shown as Equation (6), this rule ensures that if node controls node , there should not be another node (where ) that is also controlled by under the same control construct. This prevents multiple entries or exits in control structures like loops or conditional branches, which could lead to logical conflicts or errors in execution flow.
(6) |
Resource Conflict Avoidance Rule. According to Equation (7), this rule ensures if resource is used at node , no other node that executes concurrently should use the same resource . It can prevents resource conflicts which can lead to undefined behaviors or errors in the HDL circuit operation.
(7) |
Armed with the selecting insertion points, LegoHDL proceeds to inform the function generation component, providing it with all the necessary parameters (like datatype) and guidelines to construct the next level of the CPS model. Thus, the accuracy of the CPS functional model generated by the function generation component can be improved by the information guidance of the syntax guidance component
As demonstrated in Figure 5, utilizing the interaction with AST, we have generated a CPS function model. This model includes a Source function block, an Addition function block and a Display function block. This example has illustrated the interaction of CPS function generation component and syntax guidance component. Firstly, we have added two source blocks. Their data types are respectively ufix4 and ufix10. When translating to HDL code, the width of signal is and . The syntax guidance component initially determines the data type as ufix based on the data dependency rule and identifies the data bit width as exceeding . Subsequently, the syntax guidance component analyzes the control flow of the entire AST to identify potential insertion points according to the control flow rule. Ultimately, in accordance with the resource conflict avoidance rule, the syntax guidance component merges the two input operations into a single signal and relays the data type and insertion point as constrain information back to the function generation component. The function generation component selects a block based on the information and probability matrix supplied by the syntax guidance component, then inserts this block into the CPS model adhering to the formal specifications.
This process is repeated until the Source block is generated. When Source block has been added in CPS model, LegoHDL will translate the model into HDL code by using HDL Coder. LegoHDL breaks through the limitation of a single generation language when translating CPS model to HDL Code. Through HDLCoder we can specify the generated language as Verilog, VHDL or SystemVerilog. This approach also solves the problem that previous methods [6, 5] can only generate single HDL design language.
This iterative process between the syntax guidance and function generation components facilitates a dynamic and responsive design workflow. By continuously analyzing and adjusting based on the insight of AST, LegoHDL can adapt to complex design requirements and constraints. This adaptability is crucial to generate diverse and complex defect-triggering HDL code to thoroughly exercise the logic synthesis compilers.
IV Evaluation
IV-A Evaluation Setup
For testing FPGA logic synthesis compilers, it is important to determine whether the output results of generation HDL code is correct. To address these problem, LegoHDL use differential testing apprach to detect defects in logic synthesis compilers, which is shown as Figure 6. Differential testing executes the same generation HDL code model in the different synthesis compilers (e.g., Vivado, Iverilog, Yosys, and Quartus) and compares their output results. If the outputs differ, it may indicate bugs during the execution of these logic synthesis compilers.
For Iverilog, Vivado, and Quartus, which support simulation verification functions, LegoHDL has designed testbench files that incorporate CPS simulation result verification and functional logic verification. The output results of Iverilog, Vivado, and Quartus are then compared through the simulation verification of stimulus files. As Yosys does not support simulation, the equivalence checking tool Sby444https://github.com/YosysHQ/sby is employed to verify the functional consistency between the source HDL file and the Yosys-generated output netlist file through formal inspection.
In order to clearly illustrate the root cause of defects, we utilize automated reduction methods to simplify the HDL code that triggers the defect. This process enables developers to quickly comprehend and rectify defects. Specifically, we employ a technique resembling the binary search method. Leveraging the AST extracted from the HDL code, we iteratively delete portions of the code until the erroneous use case can no longer be minimized. To avoid reporting duplicate defects, we manually use failed assertions and back-trace to detect duplicates. When two defects have same failed assertion or back-trace, we consider them as duplicates. Finally, we report the detected defects which are verified as non-duplicates as new issues to official technical supports (e.g., Vivado, Iverilog, Yosys, and Quartus).
The official websites of various FPGA logic synthesis compilers eventually categorizes each issue into Confirmed as New, Confirmed as Known, Unconfirmed in Doubt (Pending Verification) and not a defect. New denotes issues that have been acknowledged as defects previously unknown to developers. Known refers to issues recognized as defects that developers were already Known. Pending indicates that developers consider the issues avoidable through specific standardized operations. To facilitate the reproduction of our findings, we have made available the HDL code files that trigger these defects on GitHub[8].
LegoHDL has been developed using MATLAB and Python, and both our code and experimental data are publicly accessible on GitHub [8]. The evaluation of LegoHDL was conducted on a computer running the Ubuntu 22.04 operating system, equipped with an Intel Core i9 CPU @ 2.10GHz, and 128GB of memory.
IV-B Research Questions
In this section four experiments are conducted to evaluate the efficiencies of LegoHDL. Specifically our evaluation aims at answering five Research Questions (RQs).
RQ1: How is the defect-finding capability of LegoHDL in HDL synthesis compilers?
RQ2: Can LegoHDL detect more FPGA logic synthesis compilers’ defects compared to the state-of-the-art methods?
RQ3: Can LegoHDL improve the complexity of HDL code compared to the state-of-the art methods?
RQ4: How efficient is LegoHDL in generating HDLCode?
In our experiments, RQ1 and RQ2 are used to evaluate the defect-finding capability of LegoHDL compared to the state-of-the-art methods. RQ3 and RQ4 are employed to evaluate AST generation for improving the complexity and improving success generation rates.
IV-C State of The Art Method
Since the VerilogHammer [6] version is too old and does not support the latest HDL syntax rules, we did not choose it as our baseline method. We choose Verismith [5] as our state of the art method, as only Verismth is the fuzzer tool of Verilog coder in FPGA logic synthesis compilers test. We reproduce Verismith [5] with source code provided by their works and use their default configurations.
Num | ID | Summary | Status | Type | Software |
---|---|---|---|---|---|
1 | #4279 | Top package import error in Systemverilog | Verified | C | Yosys |
2 | #4276 | Bit-width type conversion causes array overflow | Verified | C | Yosys |
3 | #4277 | latch inferred in synthesis process by complexity reference relationship | Verified | C | Yosys |
4 | #4217 | Syntax error: assign a variable at the same time | Pending | M | Yosys |
5 | #1110 | SystemVerilog reference error | Verified | M | Iverilog |
6 | EMtSSSA1 | Synthesis crash under unsigned delay of specific symbol | Verified | C | Vivado |
7 | WR8MSAW | Synthesis faild and crush(HARTRegInfo::Synchronousity) | Verified | C | Vivado |
8 | EOHpUSAX | Vivado synthesis faild (libc.so.6 error) | Verified | C | Vivado |
9 | EOHuZSAX | Vivado synthesis failed (librdi_synth.so) | Verified | C | Vivado |
10 | GOZ7SAO | Synthesis failed caused by groupMFFC function. | Verified | C | Vivado |
11 | H5C2SAK | Synthesis failed caused by callABC function. | Verified | C | Vivado |
12 | H19BSAS | Reference relationship error casued synthesis failed | Pending | C | Vivado |
13 | FXlJSAQ | Add component overflow | Pending | M | Vivado |
14 | C1GJxSAN | Global RAM value reset inconsistencies | Pending | M | Vivado |
15 | DL0yBSAT | Synthesis failed caused by hdi::tcltasks::task_manager::eval_in_tcl | Verified | C | Vivado |
16 | E6QSDSA3 | Synthesis failed caused by ConstProp::assertPortEquivalencies | Verified | C | Vivado |
17 | E6QUESA3 | Synthesis failed caused by HARTRegInfo::isValidForBlock | Verified | C | Vivado |
18 | E6QudSAF | Synthesis failed caused by NNetC::singleDriver | Verified | C | Vivado |
19 | M82000 | Synthesis crashed caused by code 0x3f0e5 | Verified | C | Quartus |
20 | M82156 | Arry value passed over 2 bits | Verified | M | Quartus |
-
1
There are two types of status feedback from MathWorks on defect report (i.e., = newly confirmed defect, = Pending verification). There are two types of defects (i.e., Type) in our reported defects: crash defects () and miscompilation defects ().
IV-D Answer to RQ1: Can LegoHDL have the capability of defect-detect in HDL synthesis compilers?
As demonstrated in Table II, LegoHDL identified 20 defects over a 3-month period. 16 defects have been confirmed by official technical supports, and 10 defects have been fixed (e.g., C1GJxSAN, fxlJSAQ, M82000), while 4 defects are scheduled for correction in the next software version.
Crash of synthesis (Defect H19BSAS). As shown in Figure 7, we display a defect discovered by LegoHDL. Specifically, when synthesizing HDL code, the compiler should correctly handle the reference relationships. However, the compiler did not execute the code in the model Nonpositive correctly. Nonpositive is a CPS function block that has been correctly transformed to Verilog. This complicated reference relationship can cause synthesis errors and potentially lead to compiler crashes. Verismith and current methods cannot find this defect because they lack a sufficiently comprehensive corpus to generate code, and they cannot generate complicated reference relationships between blocks. Vivado [11] will be affected by this defect.
Misscompilation of synthesis (Defect M82156). As shown in Figure8, we present another defect discovered by LegoHDL. Specifically, when synthesizing HDL code, the compiler should correctly handle the reset relationship and pass the correct values. However, the compiler failed to execute the code during the reset process and caused array overflow of add block (Add39 in Figure8), assigning value XX from 4000ps to 12000ps. Verismith and current methods cannot identify this defect because they are unable to generate HDL code with complex reset processes and detailed timing information. Both Vivado [11] and Quartus [12] will be affected by this defect. It is worth mentioning that the original file, in which the defect was discovered, was written in SystemVerilog. These defects can not be detected by SOTA method Verismith, because it can not generate HDL code written by SystemVerilog code.
IV-E Answer to RQ2: Can LegoHDL detect more FPGA logic synthesis compilers’ defects compared to the state-of-the-art methods?
Approach. To evaluate the effectiveness of LegoHDL, we compare the defects-finding capability of LegoHDL with the state-of-the-art methods Verismith [5], since finding more defects within a time period is the main objective of these methods. In this experiment we detect defects on the recently released FPGA logic synthesis compilers version. We set a single testing period of two weeks for each FPGA synthesis tool, that is every method test FPGA logic synthesis compilers for two weeks.
Result. Table III and Figure9 categorize the defects detected in our experiment into new defects (New) and previously identified defects (Known). It is evident that LegoHDL outperforms the state-of-the-art method, Verismith [5], in identifying defects. Over a two-week period, LegoHDL identified six defects, of which three were new. In contrast, Verismith [5] detected only one defects, all of which were already known in the defect repository. Furthermore, the experiment revealed that while Verismith [5] possesses a specific capability in detecting defects within Vivado, it fails to identify defects in Yosys and Iverilog. However, LegoHDL demonstrates a more balanced capability in defect detection than Verismith [5]. This is attributed to LegoHDL’s access to a more extensive corpus through the use of the Simulink HDL block library. By generating an AST to create CPS models and converting them into HDL code, LegoHDL also presents more complex data and control flows compared to Verismith [5]. These issues will be further explored in Section IV-F.
Conclusion. LegoHDL can discover defect in FPGA logic synthesis compilers. And the capability of LegoHDL for finding defects is better than our SOTA.
Vivado | IVerilog | Yosys | Total | ||
---|---|---|---|---|---|
New | Known | ||||
Verismith | 1 | 0 | 0 | 1 | 0 |
LegoHDL | 1 | 1 | 4 | 3 | 3 |
IV-F Answer to RQ3: Can LegoHDL improve the complexity of HDL code compared to the state-of-the art methods?
Approach. We have three metrics to determine the distinctiveness between the SOTA and our methods. These three metrics are derived from the AST. The first indicator is the number of nodes, that is, the number of blocks. We will tally the number of blocks in both the file generated by our model and the SOTA, and then compare the counts. In simpler terms, if an HDL design has more blocks, it is considered more complex.
The second metric is the count of lines, that is, the count of connections. A higher number of connections indicates a higher likelihood of encountering defects in the model. The third metric focuses on specific reference relationships. Complex reference relationships are more likely to expose defects. However, having ten or eleven files doesn’t mean the SOTA method, which can create only one file, is less efficient. The final result is determined by the number of partitions. We use LegoHDL and Verismith [5] to separately generate 1000 HDL code files. Setting the code scale are 700-1000 lines(Our SOTA suggests that this scale of code is the most efficience scale for finding defects) and compare the code generate by different method following these metrics.
Result. Numbers of Nodes and Connections. The most critical elements of HDL code are nodes and connections, essential for depicting the characteristics of HDL code. As illustrated in Figure10, the range of nodes and connections in HDL code generated by LegoHDL is [30,41] and [120,210]. It respectively exceeds those produced by Verismith [5], which is [21,36] and [113,174]. Notably, LegoHDL demonstrates a significant advantage in terms of connections. In terms of the median number of nodes, LegoHDL is 31% higher than Verismith, and in terms of the average number of nodes, LegoHDL is 25.1% higher than Verismith. In terms of connection median, LegoHDL is 27% higher than Verismith, and in terms of connection average, LegoHDL is 16% higher than Verismith. These metrics indicate a higher complexity of connection relationships due to the AST-guided generation of CPS models. This suggests that LegoHDL can produce more complex HDL code in terms of data flow.
Specific Reference Relationships. In HDL design, appropriate application relationships can optimize circuit design. While consolidating all code into a single file is possible, complex reference relationships pose a challenge to the compilation tool’s execution capabilities. To quantify this metric, we fix the top-level design model and counted the number of model it references. Figure10 reveals that the range of model references generated by LegoHDL surpasses those by Verismith [5], with LegoHDL outperforming Verismith [5] by 16.67% regarding the median number of reference metrics.
Conclusion. LegoHDL is capable of generating more complex HDL code in both dataflow and control flow. This complexity contributes to the superior defect-finding capabilities of LegoHDL compared to Verismith in most instances.
IV-G How efficient is LegoHDL in generating HDLCode?
Approach. In this experiment, we aim to explore the relationship between the number of CPS models and the time of generated HDL code. This investigation will allow us to better control the size of generated HDL code and verify the efficiency of LegoHDL in generating HDL code. We divide the number of CPS models into 6 intervals, from 0 to 600. For each interval, we generate 100 CPS models, convert them into HDL code, and then record the time to generate HDL code.
Result. The relationship of CPS block counts and scale of HDL Code has shown in Figure 11. When the number of models ranges from 0 to 100, the translation time for the corresponding HDL code from CPS is approximately 50 to 200 seconds. As the model count increases to 200, the translation time for HDL code rises to about 300 seconds. Upon reaching 300 models, the time to generate HDL code varies from approximately 300 to 600 seconds. At 400 models, the generation time for HDL code exceeds 800 seconds. With 400 to 500 models, the HDL code generation time spans 700 to 1,000 seconds. Increasing the model count to 600 leads to a maximum HDL code generation time of 1,400 seconds. This escalation in time is attributed to the increasing complexity of functions and reference relationships as the number of models rises, consequently extending the translation time.
Conclusion. The time required for LegoHDL to generate HDL code will increase as the number of CPS models increases. However, the efficiency of code generated by LegoHDL generally falls within the expected parameters.
V Related Works
V-1 FPGA Tool Chains Testing
In the realm of FPGA synthesis compilers testing, Verismith [5] stands out as the primary methodology. It operates as a Verilog program generator, crafting random behavioral Verilog code without undefined values, based on predefined parameter configurations. Nevertheless, the capability of Verismith [5] to generate complex HDL code is somewhat limited as it exclusively produces Verilog, one type of hardware design language. To address these limitations and enhance the thoroughness of FPGA logic synthesis compilers testing, we introduced LegoHDL, aiming to ensure the accuracy and correctness of FPGA synthesis processes.
Another tool in this domain is VlogHammer [6], a Verilog fuzzer designed for testing major commercial FPGA logic synthesis compilers and several simulators. To date, VlogHammer [6] has identified approximately 75 defects. However, unlike Verismith [5], it does not generate multi-model programs and lacks support for behavioral-level Verilog constructs, such as always blocks. Similar to Verismith [5], VlogHammer [6] also restricts its output to Verilog.
Additionally, random Verilog generators like VERGEN [13] exist, which produce behavioral-level Verilog by randomly assembling high-level logic blocks, including state machines, MUXes, and shift registers. These generators, however, rely on predefined structures to construct their configurations, resulting in limited diversity. This limitation diminishes their capacity to test a broad spectrum of Verilog structure combinations. Furthermore, VERGEN [13] employs AFL [14], a versatile fuzzer for binary files, leveraging instrumentation to guide test case mutations. Given the intricate nature of FPGA logic synthesis compilers and their myriad states, it may be challenging for fuzzers to pinpoint an effective strategy for test program generation.
In recent years, Large Language Models (LLMs) have been widely used in test case generation. The same methods are employed in FPGA logic synthesis compilers testing. The most utilized method, VeriGen [15], employs a fine-tuned open-source CodeGen-16B model as a substitute for the commercial state-of-the-art GPT-3.5-turbo. It demonstrates a 41% improvement in generating syntactically correct Verilog code across various problem categories compared to the pre-trained LLM generation method. However, while VeriGen excels in generating code, it is not specifically focused on testing; its capability in test case generation is limited by its corpus—a Verilog dataset compiled from GitHub and Verilog textbooks. This means the Verilog program generated by VeriGen may focus on specific aspects but cannot thoroughly test FPGA logic synthesis compilers. Furthermore, VeriGen cannot generate stimulus files, which further constrains the accuracy of testing. Other methods, such as BetterV [16], focus on optimizing Verilog code and reducing runtime. Currently, due to limitations in the accuracy of the corpus and the scale of model generation, LLMs are not sufficiently effective for HDL generation testing.
Moreover, numerous efforts have been dedicated to enhancing the reliability of FPGA development compilers. For instance, Yann Herklotz et al. [17] have focused on bolstering the stability of high-level synthesis (HLS) tools through formal verification, proposing Vericert, a formally verified HLS tool. Zewei Du et al. [18] have explored the application of fuzz testing to exhaustively evaluate HLS tools by supplying a vast array of valid C programs.
Despite these contributions, there remains a gap in the quality and complexity of the generated files, with a singular focus on one programming language. Consequently, we have embarked on a more comprehensive testing of FPGA logic synthesis compilers to affirm their stability and reliability.
V-2 Differential Testing in Compiler Testing
Differential testing [19, 20, 21, 22] considers the generation of equivalent variants of HDL code based on the input of a program. It detects defects by comparing the outcomes of different variants. Differential testing has been thoroughly validated in widely used compilation tools such as GCC and LLVM, identifying over a thousand defects [19, 23, 24, 25, 26, 27, 28].
In compiler testing, there are three EMI (Equivalent Moudle Input)-based differential testing mutation methods, including Orion [29], Athena [30], and Hermes [31]. Orion [29] focuses on mutating dynamic dead code regions by randomly pruning unexecuted statements to generate variant programs, while Athena [30] is capable of inserting or removing code in these areas under different inputs. Unlike Orion [29] and Athena [30], which only mutate in dead code areas, Hermes [31] can mutate both live and dead code areas to produce equivalent variants.
Beyond EMI-based differential testing, Jiang et al. [27] introduced CTOS, which employs arbitrary optimization sequences to identify compiler defects in LLVM. Their method significantly enhanced the capability to detect defects. Tang et al. [32] proposed a diversity-guided program mutation method to detect compiler warning defects. Chen et al. [33] introduced a history-guided configuration diversification method for testing compilers.
VI Conclusion and Future Work
In this paper, we introduce LegoHDL to generate complex and diverse HDL code for logic synthesis compilers testing. LegoHDL comprises two components: the function generation component and the syntax guidance component. The former component leverages extensive CPS model libraries to create diverse CPS function models. The latter component uses HDLCoder to convert CPS function models into HDL code, and analyzes the corresponding AST for guiding the function generation component to insert additional CPS function models at a certain insertion position. The two components continue to interact until the final HDL code and corresponding CPS model are generated, which is similar to Lego by piecing together small pieces of discrete functional component into a complete large project. Within three months, the HDL code generated by LegoHDL has detected 20 defects – many of which are deep and important in logic synthesis compilers.
In the future work, we plan to further improve LegoHDL by generating more complex HDL code. In addition, we plan to conduct an empirical study to deeply compare the effectiveness of different testing methods on more FPGA development tools.
Acknowledgment
This work was supported by the National Natural Science Foundation of China (No.62202079, No.62032004), the Dalian Excellent Young Project (2022RY35).
References
- [1] M. Ligthart, K. Fant, R. Smith, A. Taubin, and A. Kondratyev, “Asynchronous design using commercial hdl synthesis tools,” in Proceedings Sixth International Symposium on Advanced Research in Asynchronous Circuits and Systems (ASYNC 2000)(Cat. No. PR00586). IEEE, 2000, pp. 114–125.
- [2] C. Wolf, J. Glaser, and J. Kepler, “Yosys-a free verilog synthesis suite,” in Proceedings of the 21st Austrian Workshop on Microelectronics (Austrochip), 2013, p. 97.
- [3] R. Dekker, M. Ligthart, and L. Lapides, “Hdl synthesis for fpga design,” Electronic Engineering, vol. 66, no. 814, 1994.
- [4] “Intel fpga solution,” https://www.intel.com/content/dam/www/central-libraries/us/en/documents/2022-08/intel-fpga-industrial-solutions-playbook-2022.pdf, 2022.
- [5] Y. Herklotz and J. Wickerson, “Finding and understanding bugs in FPGA synthesis tools,” in FPGA ’20: The 2020 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays, Seaside, CA, USA, February 23-25, 2020, S. Neuendorffer and L. Shannon, Eds. ACM, 2020, pp. 277–287. [Online]. Available: https://doi.org/10.1145/3373087.3375310
- [6] “Vloghammer,” https://github.com/YosysHQ/VlogHammer, 2019.
- [7] “Hdl coder,” https://www.mathworks.com/products/hdl-coder.html, 2023.
- [8] “Legohdl,” https://github.com/cemery123/LegoHDL, 2024.
- [9] “Combinational loop,” https://support.xilinx.com/s/question/0D52E00006hpWLASA2/what-is-combinational-loop-?language=ja, 2022.
- [10] “Pipeline-optimization,” https://www.mathworks.com/help/hdlcoder/ug/clock-rate-pipelining.html, 2022.
- [11] “Vivado,” https://china.xilinx.com/support/download.html, 2023.
- [12] “Quartus,” https://https://www.intel.com/content/www/us/en/products/details/fpga/development-tools/quartus-prime.html, 2023.
- [13] B. Ratchev, M. Hutton, G. Baeckler, and B. van Antwerpen, “Verifying the correctness of fpga logic synthesis algorithms,” in Proceedings of the 2003 ACM/SIGDA Eleventh International Symposium on Field Programmable Gate Arrays, ser. FPGA ’03. New York, NY, USA: Association for Computing Machinery, 2003, p. 127–135. [Online]. Available: https://doi.org/10.1145/611817.611837
- [14] A. Fioraldi, D. C. Maier, H. Eißfeldt, and M. Heuse, “AFL++ : Combining incremental steps of fuzzing research,” in 14th USENIX Workshop on Offensive Technologies, WOOT 2020, August 11, 2020, Y. Yarom and S. Zennou, Eds. USENIX Association, 2020. [Online]. Available: https://www.usenix.org/conference/woot20/presentation/fioraldi
- [15] S. Thakur, B. Ahmad, H. Pearce, B. Tan, B. Dolan-Gavitt, R. Karri, and S. Garg, “Verigen: A large language model for verilog code generation,” ACM Transactions on Design Automation of Electronic Systems, vol. 29, no. 3, pp. 1–31, 2024.
- [16] Z. Pei, H. Zhen, M. Yuan, Y. Huang, and B. Yu, “Betterv: Controlled verilog generation with discriminative guidance,” CoRR, vol. abs/2402.03375, 2024. [Online]. Available: https://doi.org/10.48550/arXiv.2402.03375
- [17] M. Pardalos, Y. Herklotz, and J. Wickerson, “Resource sharing for verified high-level synthesis,” in 30th IEEE Annual International Symposium on Field-Programmable Custom Computing Machines, FCCM 2022, New York City, NY, USA, May 15-18, 2022. IEEE, 2022, pp. 1–6. [Online]. Available: https://doi.org/10.1109/FCCM53951.2022.9786208
- [18] Y. Herklotz, Z. Du, N. Ramanathan, and J. Wickerson, “An empirical study of the reliability of high-level synthesis tools,” in 29th IEEE Annual International Symposium on Field-Programmable Custom Computing Machines, FCCM 2021, Orlando, FL, USA, May 9-12, 2021. IEEE, 2021, pp. 219–223. [Online]. Available: https://doi.org/10.1109/FCCM51124.2021.00034
- [19] J. Chen, W. Hu, D. Hao, Y. Xiong, H. Zhang, L. Zhang, and B. Xie, “An empirical comparison of compiler testing techniques,” in Proceedings of the 38th International Conference on Software Engineering, ICSE 2016, Austin, TX, USA, May 14-22, 2016, L. K. Dillon, W. Visser, and L. A. Williams, Eds. ACM, 2016, pp. 180–190. [Online]. Available: https://doi.org/10.1145/2884781.2884878
- [20] W. M. McKeeman, “Differential testing for software,” Digital Technical Journa, vol. 10, no. 1, pp. 100–107, 1998.
- [21] C. Lidbury, A. Lascu, N. Chong, and A. F. Donaldson, “Many-core compiler fuzzing,” ACM SIGPLAN Notices, vol. 50, no. 6, pp. 65–76, 2015. [Online]. Available: https://doi.org/10.1145/2813885.2737986
- [22] Y. Yang, Y. Zhou, H. Sun, Z. Su, Z. Zuo, L. Xu, and B. Xu, “Hunting for bugs in code coverage tools via randomized differential testing,” International Conference on Software Engineering (ICSE 2019), pp. 488–499, 2019. [Online]. Available: https://doi.org/10.1109/ICSE.2019.00061
- [23] J. Chen, J. Patra, M. Pradel, Y. Xiong, H. Zhang, D. Hao, and L. Zhang, “A survey of compiler testing,” ACM Comput. Surv., vol. 53, no. 1, pp. 4:1–4:36, 2021. [Online]. Available: https://doi.org/10.1145/3363562
- [24] L. Cai, Y. Fan, M. Yan, and X. Xia, “Just-in-time software defect prediction: Literature review,” Ruanjian Xuebao, vol. 30, no. 5, pp. 1288–1307, May 2019.
- [25] Y. Tang, H. Jiang, Z. Zhou, X. Li, Z. Ren, and W. Kong, “Detecting compiler warning defects via diversity-guided program mutation,” IEEE Trans. Software Eng., vol. 48, no. 11, pp. 4411–4432, 2022. [Online]. Available: https://doi.org/10.1109/TSE.2021.3119186
- [26] Y. Tang, Z. Ren, W. Kong, and H. Jiang, “Compiler testing: a systematic literature analysis,” Frontiers Comput. Sci., vol. 14, no. 1, pp. 1–20, 2020. [Online]. Available: https://doi.org/10.1007/s11704-019-8231-0
- [27] H. Jiang, Z. Zhou, Z. Ren, J. Zhang, and X. Li, “CTOS: compiler testing for optimization sequences of LLVM,” IEEE Trans. Software Eng., vol. 48, no. 7, pp. 2339–2358, 2022. [Online]. Available: https://doi.org/10.1109/TSE.2021.3058671
- [28] J. Chen, G. Wang, D. Hao, Y. Xiong, H. Zhang, and L. Zhang, “History-guided configuration diversification for compiler test-program generation,” in 34th IEEE/ACM International Conference on Automated Software Engineering, ASE 2019, San Diego, CA, USA, November 11-15, 2019. IEEE, 2019, pp. 305–316. [Online]. Available: https://doi.org/10.1109/ASE.2019.00037
- [29] V. Le, M. Afshari, and Z. Su, “Compiler validation via equivalence modulo inputs,” in ACM SIGPLAN Conference on Programming Language Design and Implementation, PLDI ’14, Edinburgh, United Kingdom - June 09 - 11, 2014, M. F. P. O’Boyle and K. Pingali, Eds. ACM, 2014, pp. 216–226. [Online]. Available: https://doi.org/10.1145/2594291.2594334
- [30] V. Le, C. Sun, and Z. Su, “Finding deep compiler bugs via guided stochastic program mutation,” in Proceedings of the 2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications, OOPSLA 2015, part of SPLASH 2015, Pittsburgh, PA, USA, October 25-30, 2015, J. Aldrich and P. Eugster, Eds. ACM, 2015, pp. 386–399. [Online]. Available: https://doi.org/10.1145/2814270.2814319
- [31] C. Sun, V. Le, and Z. Su, “Finding compiler bugs via live code mutation,” in Proceedings of the 2016 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications, OOPSLA 2016, part of SPLASH 2016, Amsterdam, The Netherlands, October 30 - November 4, 2016, E. Visser and Y. Smaragdakis, Eds. ACM, 2016, pp. 849–863. [Online]. Available: https://doi.org/10.1145/2983990.2984038
- [32] Y. Tang, H. Jiang, Z. Zhou, X. Li, Z. Ren, and W. Kong, “Detecting compiler warning defects via diversity-guided program mutation,” IEEE Transactions on Software Engineering, pp. 1–1, 2021. [Online]. Available: https://doi.org/10.1109/TSE.2021.3119186
- [33] J. Chen, G. Wang, D. Hao, Y. Xiong, H. Zhang, and L. Zhang, “History-guided configuration diversification for compiler test-program generation,” International Conference on Automated Software Engineering (ASE 2019), pp. 305–316, 2019. [Online]. Available: https://doi.org/10.1109/ASE.2019.00037