Verilog 示例
本文包含一些简单 Verilog 代码片段和对应综合结果(使用 DC 完成综合),注意 GTECH Cell 和 Target Cell 的区别。部分综合后图片较大的综合结果没有放在当前页面上,可以考虑自己用 Yosys 或者 DC 查看综合结果(参考:Digitaljs_online)。为节约资源,本文只提供前几段 Verilog 代码的综合结果(包括 DC 与 DigitalJS)
代码
test_1_always
module test_1_always (A_in, B_in, C_in, D_out);
input A_in, B_in, C_in;
output D_out;
reg D_out;
reg Temp;
// always @* begin
always @(A_in or B_in or C_in) begin
D_out = Temp | C_in;
Temp = A_in & B_in;
end
endmodule
muxtwo
module muxtwo (out, a, b, sl);
input a, b, sl;
output out;
reg out;
always @(sl or a or b)
if (!sl) out = a;
else out = b;
endmodule
adff
module adff (Clock, D, Q, E, R);
input Clock, D, R, E;
output Q;
reg Q;
always @(posedge Clock or negedge R) begin
if (~R) Q <= 0;
else begin
if (E) Q <= D;
end
end
endmodule
Case add_sub32
module add_sub32 (
input wire typ, // type 决定运算类型
input wire [31:0] in1,
input wire [31:0] in2,
output reg [31:0] out
);
always @(*) begin
case (typ)
1'b1 : out <= in1 + in2; // type 为 1,执行加法运算
1'b0 : out <= in1 - in2; // type 为 0,执行减法运算
default : out <= 32'h0;
endcase
end
endmodule
for/while/repeat
for vote7
module vote7 (
vote,
pass
);
input wire [7:1] vote;
output reg pass;
reg [2:0] sum;
integer i;
always @(vote) begin
sum = 0;
for (i = 1; i < 7; i = i + 1)
if (vote[i])
sum = sum+1; //如果 vote[i]为 1,那么 sum 加 1,注意此处使用阻塞赋值
if (sum[2] == 1'b1) //如果 sum 大于等于 4,那么输出 pass 为 1
pass = 1;
else pass = 0;
end
endmodule