如何將值delay n個clock? (SOC) (Verilog)

本文介绍了使用Verilog HDL实现信号延迟的四种不同方法。通过这些方法,可以针对不同的时钟周期实现信号延迟,每种方法都有其独特的编码风格,便于理解和维护。

转自:http://www.cnblogs.com/oomusou/archive/2009/06/15/verilog_dly_n_clk.html

复制代码
 1 /* 
 2 (C) OOMusou 2009 http://oomusou.cnblogs.com
 3 
 4 Filename    : delay_3t.v
 5 Compiler    : NC-Verilog 5.4
 6 Description : delay 3t method 1
 7 Release     : 06/15/2009 1.0
 8 */
 9 
10 module delay_3t (
11   clk,
12   rst_n,
13   d,
14   q
15 );
16 
17 input  clk;
18 input  rst_n;
19 input  d;
20 output q;
21 
22 reg d_dly_1t;
23 reg d_dly_2t;
24 reg d_dly_3t;
25 
26 assign q = d_dly_3t;
27 
28 always@(posedge clk or negedge rst_n) begin
29   if (!rst_n) begin
30     d_dly_1t <= 0;
31     d_dly_2t <= 0;
32     d_dly_3t <= 0;
33   end
34   else begin
35     d_dly_1t <= d;
36     d_dly_2t <= d_dly_1t;
37     d_dly_3t <= d_dly_2t;
38   end
39 end
40 
41 endmodule
复制代码
复制代码
 1 /* 
 2 (C) OOMusou 2009 http://oomusou.cnblogs.com
 3 
 4 Filename    : delay_3t.v
 5 Compiler    : NC-Verilog 5.4
 6 Description : delay 3t method 2
 7 Release     : 06/15/2009 1.0
 8 */
 9 
10 module delay_3t (
11   clk,
12   rst_n,
13   d,
14   q
15 );
16 
17 input  clk;
18 input  rst_n;
19 input  d;
20 output q;
21 
22 reg d_dly_1t;
23 reg d_dly_2t;
24 reg d_dly_3t;
25 
26 assign q = d_dly_3t;
27 
28 always@(posedge clk or negedge rst_n) begin
29   if (!rst_n)
30     {d_dly_3t, d_dly_2t, d_dly_1t}  <= 0;
31   else
32     {d_dly_3t, d_dly_2t, d_dly_1t} <= {d_dly_2t, d_dly_1t, d};
33 end
34 
35 endmodule
复制代码
复制代码
 1 /* 
 2 (C) OOMusou 2009 http://oomusou.cnblogs.com
 3 
 4 Filename    : delay_nt.v
 5 Compiler    : NC-Verilog 5.4
 6 Description : delay 3t method 3
 7 Release     : 06/15/2009 1.0
 8 */
 9 
10 module delay_nt (
11   clk,
12   rst_n,
13   d,
14   q
15 );
16 
17 parameter n = 1;
18 
19 input  clk;
20 input  rst_n;
21 input  d;
22 output q;
23 
24 reg [n-1:0] r;
25 
26 assign q = r[n-1];
27 
28 integer i;
29 
30 always@(posedge clk or negedge rst_n) begin
31   if (!rst_n) 
32     r <= 0;
33   else begin
34     for(i=0; i<n-1; i=i+1)
35       r[i+1] <= r[i];
36       
37     r[0] <= d;
38   end
39 end
40 
41 endmodule
复制代码
复制代码
 1 /* 
 2 (C) OOMusou 2009 http://oomusou.cnblogs.com
 3 
 4 Filename    : delay_nt.v
 5 Compiler    : NC-Verilog 5.4
 6 Description : delay 3t method 4
 7 Release     : 06/15/2009 1.0
 8 */
 9 
10 module delay_nt (
11   clk,
12   rst_n,
13   d,
14   q
15 );
16 
17 parameter n = 3;
18 
19 input  clk;
20 input  rst_n;
21 input  d;
22 output q;
23 
24 reg [n-1:0] r;
25 
26 assign q = r[n-1];
27 
28 always@(posedge clk or negedge rst_n) begin
29   if (!rst_n) 
30     r <= 0;
31   else
32     r <= {r, d};  
33 end
34 
35 endmodule
复制代码

{}写法是Verilog的独门绝技,这样就不再需要for,这也是为什么Verilog宁愿从C语言抢走{}换来begin, end,因为{}这种合并的写法非常的好用。Testbench与模拟波型图也与Method 1与Method 2一样,再次省略。这种写法使用了parameter,无论要delay几个clk,只需修改n即可,而且与Quartus II优化后的硬件一样,我们再次将编译过的RTL Viewer打开做验证。

 

Conclusion
这4种写法最后合出来的硬件都一样,表示现在的合成器都够聪明,差别只是在哪种coding style较好,将来比较好维护。另外也是开开眼界,若将来阅读其他人的code,马上就知道对方想表达的意思。

<think>嗯,用户问的是芯片软接口和硬接口在Verilog实现上的区别。这个问题挺专业的,看来用户可能是在做数字IC设计相关的工作。 从用户引用的两篇文献看,第一篇讲的是8255芯片的Verilog实现流程,第二篇提到了JTAG接口的可复用设计。用户特意强调引用仅供参考,说明ta更关注核心概念的区别而非具体案例。 软硬接口的区别主要体现在三个维度: 首先是功能定位。软接口本质是数据通路,像APB/AXI这些总线协议,用SystemVerilog的interface封装很方便;硬接口则是物理信号,必须严格满足时序和电气特性。 其次是实现层面。软接口可以优雅地用interface打包信号组,支持参数化和modport隔离方向;硬接口则要处理具体的IO pad、电平转换和时序约束,往往要调用工艺库原语。 最后是验证方法。软接口用基于事务的验证很方便,比如UVM的sequence;硬接口则需要考虑SI/PI效应,要做后仿和ATE测试。 用户上次问过类似问题,这次明显更聚焦代码实现层面。或许ta正在做SoC集成,需要协调软硬件接口?可以补充些模块封装的建议。 不过要注意避免堆砌术语,用对比表格会更清晰。代码示例选最常见的APB和GPIO就行,毕竟用户引用里也提到基础接口设计。 </think>在芯片设计中,软接口与硬接口的Verilog实现存在本质差异,主要体现在功能定位、实现方式和验证流程上,以下是详细对比: --- ### **一、软接口 (协议类接口)** **定义**:实现模块间通信协议(如AXI、APB、UART等),由逻辑电路实现通信规则。 **Verilog实现特点**: 1. **抽象化描述** 使用参数化设计协议时序,例如APB总线接口: ```verilog module apb_master #(parameter ADDR_WIDTH=32, DATA_WIDTH=32)( input logic PCLK, PRESETn, output logic [ADDR_WIDTH-1:0] PADDR, output logic PSEL, PENABLE, PWRITE, output logic [DATA_WIDTH-1:0] PWDATA, input logic [DATA_WIDTH-1:0] PRDATA ); // 状态机实现APB协议时序 always_ff @(posedge PCLK) begin if (!PRESETn) begin /* 复位逻辑 */ end else case(state) IDLE: if (req) begin PSEL<=1; state<=SETUP; end SETUP: begin PENABLE<=1; state<=ACCESS; end ACCESS: if (PREADY) begin PSEL<=0; PENABLE<=0; end endcase end endmodule ``` *参数化设计支持灵活复用[^2]。* 2. **无物理层约束** 仅关注逻辑状态跳变(如`PREADY`响应信号),不涉及电气特性或驱动强度。 3. **验证依赖仿真** 通过Testbench模拟协议场景: ```verilog initial begin // 测试操作 force dut.PREADY = 0; #20ns; force dut.PREADY = 1; // 模拟从设备响应延时 end ``` --- ### **二、硬接口 (物理层接口)** **定义**:连接芯片与外部设备的电气接口(如GPIO、USB PHY、DDR接口),需满足物理层规范。 **Verilog实现特点**: 1. **工艺相关原语调用** 必须实例化工艺库提供的物理单元: ```verilog module gpio_pad( inout wire pad_io, // 双向端口 input logic core_out, output logic core_in, input logic oe // 输出使能 ); // 调用工艺库的IO Pad原语 PDIO12T u_pad( .PAD(pad_io), .CORE_OUT(core_out), .CORE_IN(core_in), .OE(oe) ); endmodule ``` *依赖厂商提供的IO库实现电气特性[^1]。* 2. **电气约束显式声明** 需在约束文件(SDC)中定义: ``` set_drive_strength [get_ports {usb_dp}] 12mA set_input_delay -clock clk_i 2.5 [get_ports {ddr_dq}] ``` 3. **后仿与硬件测试强制要求** - 后仿需加载SDF时序文件 - 实测需关注信号完整性(如眼图测试) --- ### **三、核心差异总结** | **特性** | 软接口 | 硬接口 | |-------------------|--------------------------|--------------------------| | **实现目标** | 通信协议 | 电气信号传输 | | **代码核心** | 状态机/时序逻辑 | 工艺原语实例化 | | **参数化** | 高度支持(如总线位宽)[^2] | 受限(依赖工艺库) | | **关键验证阶段** | 功能仿真 | 后仿+ATE测试 | | **跨项目复用** | 直接移植 | 需重新适配工艺库 | --- ### **四、协同工作示例** 在SoC中软硬接口协同: ```verilog module soc_top( inout wire [31:0] gpio_pads, // 硬接口 output wire uart_tx // 硬接口 ); // 软接口:APB总线连接外设 apb_master apb(.*); gpio_controller gpio( .apb_if (apb), // 协议接口 .pads (gpio_pads) // 物理接口 ); // 硬接口绑定工艺库 PDIO12T u_gpio_pad[31:0](.PAD(gpio_pads)); endmodule ``` > 📌 **设计要点**:软接口实现控制流,硬接口处理信号物理转换,通过层次化隔离协议与电气实现[^1]。 --- ### **应用建议** 1. **软接口**:优先用SystemVerilog `interface`封装协议信号组,提升可维护性: ```verilog interface apb_if #(parameter WIDTH=32)(input clk); logic [WIDTH-1:0] addr; logic [WIDTH-1:0] wdata, rdata; modport master (output addr, wdata, input rdata); endinterface ``` 2. **硬接口**: - 严格遵循厂商IO文档的驱动能力限制 - 预留校准电路(如DDR的ZQ校准) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值