Verilog 示例

2024-03-17
1 min read
EE

本文包含一些简单 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

综合

syn_test_1_always

syn_muxtwo

syn_adff

Previous Python