求助:verilog中调用其他module的语法问题

delacrxoix_xu 2011-05-26 10:23:41
我想在 registers 模块中, 调用 register 模块,组合出 60个寄存器, 这60个寄存器都是 register的实例。
但是其中有些 寄存器的 某些bit是 只读的,是由 外部信号控制的。
例如00H寄存器中,第四个bit代表 全双工,由外部信号控制,

此时 读写寄存器 就要 空出一个 bit来。

这个是调用。
//Net Control Register . 00H
wire temp1;
mac_register NCR_1
(
.DataIn (DataIn),
.DataOut ({NCR_OUT[7:4],temp1,NCR_OUT[2:0]}),
//.DataOut (NCR_OUT),
.Write (Write),
.Clk (Clk),
.Reset (Reset),
.SyncReset (1'b0)
);
assign NCR_OUT[3] = FullD_In;


我目前的办法是,分而治之。把NCR_OUT的不受控制的那个bit空出来。
但是({NCR_OUT[7:4], ,NCR_OUT[2:0]}),但我发现只是空出来,不管用。
必须用一个 占位 连线 temp1 占据那一空位才行

请问各位大侠有什么好办法么?







这是registers 的 代码


module mac_registers( DataIn, Address, Rw, Cs, Clk, Reset, DataOut,
FullD_In, //test,test2,test3,dataInTest
);
parameter Tp = 1;

input [7:0] DataIn;
input [7:0] Address;
input Rw;
input Cs;
input Clk;
input Reset;

output [7:0] DataOut;
reg [7:0] DataOut;

input FullD_In;

wire Write = Cs & Rw;
wire Read = Cs & ~Rw;
wire NCR_SEL = Write && (Address == 8'h0);


wire [7:0] NCR_OUT;


//Net Control Register . 00H
wire temp1;
mac_register NCR_1
(
.DataIn (DataIn),
.DataOut ({NCR_OUT[7:4],temp1,NCR_OUT[2:0]}),
//.DataOut (NCR_OUT),
.Write (Write),
.Clk (Clk),
.Reset (Reset),
.SyncReset (1'b0)
);
assign NCR_OUT[3] = FullD_In;


// Reading data from registers
always @ (Read or NCR_OUT or NCR_SEL)
begin
if(Read) // read
case(Address)
8'h0: DataOut<=NCR_OUT;
default: DataOut<=8'h0;
endcase

else
DataOut<=8'h0;
end

endmodule




这是 register的代码


module mac_register(DataIn, DataOut, Write, Clk, Reset, SyncReset);

parameter WIDTH = 8; // default parameter of the register width
parameter RESET_VALUE = 0;

input [WIDTH-1:0] DataIn;

input Write;
input Clk;
input Reset;
input SyncReset;

output [WIDTH-1:0] DataOut;
reg [WIDTH-1:0] DataOut;

always @ (posedge Clk or posedge Reset)
begin
if(Reset)
DataOut<=#1 RESET_VALUE;
else
if(SyncReset)
DataOut<=#1 RESET_VALUE;
else
if(Write) // write
DataOut<=#1 DataIn;
end

endmodule // Register
...全文
2934 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
elone_j 2011-06-09
  • 打赏
  • 举报
回复
不认真看书,该打屁股!
d_lina 2011-06-08
  • 打赏
  • 举报
回复
我发现,temp1不用声明也行。也就是把 wire temp1; 去掉
然后我还发现,名称随便起, 居然编译综合都能通过。
这是出于什么考虑?挺奇怪的,这种bug太严重了

这个是因为,在verilog中如果使用一个变量,而没对其声明的话,默认是wire型的变量
d_lina 2011-06-08
  • 打赏
  • 举报
回复
module mac_registers( DataIn, Address, Rw, Cs, Clk, Reset, DataOut,
FullD_In, //test,test2,test3,dataInTest
);

在FullD_In后面为什么还有,呢?这样也可以编译吗?
zkh0010 2011-05-29
  • 打赏
  • 举报
回复
你那个output是一组啊,如果不用wire占位的话,会对应不上的。你用一个wire把它的位置站住,然后wire什么都不连。生成的硬件结构应该就是那个引脚空下来了。这应该没问题的吧?
delacrxoix_xu 2011-05-27
  • 打赏
  • 举报
回复
我发现,temp1不用声明也行。也就是把 wire temp1; 去掉
然后我还发现,名称随便起, 居然编译综合都能通过。
这是出于什么考虑?挺奇怪的,这种bug太严重了
delacrxoix_xu 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bsnow 的回复:]

没太看懂你的意思。 但是调用的时候不定一要加“wire temp1”,你可以写成
.DataOut ({NCR_OUT[7:4],1'bz,NCR_OUT[2:0]}),
或者
.DataOut ({NCR_OUT[7:4],1'bx,NCR_OUT[2:0]}),
应该都行
[/Quote]

不行啊,说必须接到一个 结构表达式上
Error (10663): Verilog HDL Port Connection error at mac_registers.v(170): output or inout port "DataOut" must be connected to a structural net expression
bsnow 2011-05-27
  • 打赏
  • 举报
回复
对,我看错了。 因为你是output, 条用的时候必须连接到wire。
bsnow 2011-05-26
  • 打赏
  • 举报
回复
没太看懂你的意思。 但是调用的时候不定一要加“wire temp1”,你可以写成
.DataOut ({NCR_OUT[7:4],1'bz,NCR_OUT[2:0]}),
或者
.DataOut ({NCR_OUT[7:4],1'bx,NCR_OUT[2:0]}),
应该都行

6,163

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧