Verilog HDL 能实现 C 中“#if ... #else ...”的功能吗?
Can Verilog HDL realize what “#if ... #else ...” do in C?
我想编写一个带有参数的模块,该参数决定使用哪个时钟边沿。而且我知道我可以使用选择器来获取时钟或反向时钟,然后使用 posedge。我只是对如何在预编译中实现它感兴趣。
通过使用 Verilog 编译器指令(一种预处理器命令):
`define EDGE posedge
always @(`EDGE clk) begin
... stuff...
end
或者这样:
`define POSITIVE 0
`define NEGATIVE 1
`define EDGE `POSITIVE
`if (`EDGE==`POSITIVE)
always @(posedge clk) begin
`else
always @(negedge clk) begin
`endif
... stuff...
end
尚未测试参数和指令,但这也可能有效:
module #(parameter whichedge=0) ( // 0=posedge, 1=negedge
input wire clk,
input wire rst,
...
...
)
`if (whichedge==0)
always @(posedge clk) begin
`else
always @(negedge clk) begin
`endif
... stuff ...
end
`module myD #(参数 whichedge=0)
(输入线时钟,
输入线a,
输出 reg b);
生成
如果(whichedge == 0)
开始
总是@(posedge clk)
b <= a;
结尾
别的
开始
总是@(否定时钟)
b <= a;
结尾
结束生成
结束模块`
我想编写一个带有参数的模块,该参数决定使用哪个时钟边沿。而且我知道我可以使用选择器来获取时钟或反向时钟,然后使用 posedge。我只是对如何在预编译中实现它感兴趣。
通过使用 Verilog 编译器指令(一种预处理器命令):
`define EDGE posedge
always @(`EDGE clk) begin
... stuff...
end
或者这样:
`define POSITIVE 0
`define NEGATIVE 1
`define EDGE `POSITIVE
`if (`EDGE==`POSITIVE)
always @(posedge clk) begin
`else
always @(negedge clk) begin
`endif
... stuff...
end
尚未测试参数和指令,但这也可能有效:
module #(parameter whichedge=0) ( // 0=posedge, 1=negedge
input wire clk,
input wire rst,
...
...
)
`if (whichedge==0)
always @(posedge clk) begin
`else
always @(negedge clk) begin
`endif
... stuff ...
end
`module myD #(参数 whichedge=0) (输入线时钟, 输入线a, 输出 reg b);
生成 如果(whichedge == 0) 开始 总是@(posedge clk) b <= a; 结尾 别的 开始 总是@(否定时钟) b <= a; 结尾 结束生成
结束模块`