gpt4 book ai didi

verilog - 如何在verilog中动态声明输入/输出端口(显示/不显示)?

转载 作者:行者123 更新时间:2023-12-03 21:32:41 26 4
gpt4 key购买 nike

我的意思是除了使用参数和端口数组(或扁平数组方法)之外,是否可以动态启用/禁用输入/输出端口?
更具体地说,给定一个简单的模块如下,是否可以只显示
B_IN、B_OUT 仅在需要时(B_EN=1)?

例子

module  WEIRD_MOD#(
parameter integer WIDTH_A=8,
parameter integer B_EN=0,
parameter integer WIDTH_B=13;
)
(
input [WIDTH_A-1:0] A_IN,
output [WIDTH_A-1:0] A_OUT,

// ******************************//
// only valid/show when B_EN =1 //
// ******************************//
//input [WIDTH_B-1:0] B_IN,
//output [WIDTH_B-1:0] B_OUT,

);

genvar idx_bit;
generate
for( idx_bit=0; idx_bit<WIDTH_A; idx_bit= idx_bit+1)
begin
bit_inv inv_inst(.IN(A_OUT[idx_bit]),.OUT(A_OUT[idx_bit]));
end

if(B_EN)
begin
for( idx_bit=0; idx_bit<WIDTH_B; idx_bit= idx_bit+1)
begin
bit_buf buf_inst(.IN(B_OUT[idx_bit]),.OUT(B_OUT[idx_bit]));
end
end

endgenerate

endmodule

最佳答案

不,Verilog 不允许您使用参数更改端口数量或其方向。使用像 `ifdef 这样的宏和 `define只能为所有实例更改它们。

您可以做的一件事是在启用 B_EN 时将 A 和 B 端口的宽度合并为一个端口。

module  WEIRD_MOD#(
parameter integer WIDTH_A=8,
parameter integer B_EN=0,
parameter integer WIDTH_B=13;
)
(
input [WIDTH_A-1 + (B_EN ? WIDTH_B : 0) :0] AB_IN,
output [WIDTH_A-1 + (B_EN ? WIDTH_B : 0) :0] AB_OUT,
);

genvar idx_bit;
generate
for( idx_bit=0; idx_bit<WIDTH_A; idx_bit= idx_bit+1)
begin
bit_inv inv_inst(.IN(A_OUT[idx_bit]),.OUT(A_OUT[idx_bit]));
end

if(B_EN)
begin
for( idx_bit=0; idx_bit<WIDTH_B; idx_bit= idx_bit+1)
begin
bit_buf buf_inst(.IN(B_OUT[idx_bit+WIDTH_A]),.OUT(B_OUT[idx_bit+WIDTH_A]));
end
end

endgenerate

endmodule

关于verilog - 如何在verilog中动态声明输入/输出端口(显示/不显示)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40717134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com