Verilog中子模块输出作为新子模块输入无数据输出问题求助
问题排查与修正方案
看起来你在Verilog模块互联和时序逻辑设计上踩了几个典型的坑,咱们一步步拆解问题,然后给出修正后的代码:
核心问题分析
位宽严重不匹配
你明确提到生成的是228位的Secret_Key,但你的代码里不管是顶层模块还是Combine_bit子模块,都把Secret_Key、Plaintext_data、Ciphertext定义成了单bit信号。这就好比你把一根228芯的电缆插进了1孔的插座,数据根本没法正常传输,仿真自然看不到有效输出。时序逻辑设计完全错误
Combine_bit模块的always块只在Reset上升沿触发时赋值,正常时钟沿(posedge Clk)下完全没有处理逻辑。而且复位信号的作用通常是把输出清零,不是在复位阶段去计算异或,这完全搞反了时序逻辑的设计原则。信号重复声明
在顶层模块和Combine_bit模块里,你都同时把Plaintext_data声明为input又wire,这属于冗余且不符合Verilog语法规范的写法,会导致编译警告甚至逻辑错误。缺少密钥有效性的同步判断
Encryp_System生成密钥需要一定的时钟周期,Combine_bit应该等密钥生成完成后再开始运算,否则拿到的可能是模块初始化的无效值。
修正后的代码
顶层模块(修正位宽与冗余声明)
// -------top module------- module Communication_security( // 声明所有IO端口 input Clk, input Reset, input Start, input [227:0] Plaintext_data, // 与Secret_Key保持228位位宽匹配 output [227:0] Secret_Key, output [227:0] Ciphertext ); // 实例化密钥生成子模块 Encryp_System Es( .Start(Start), .Clk(Clk), .Reset(Reset), .Secret_Key(Secret_Key) // 你确认该模块已正常生成228位密钥,这里直接互联即可 ); // 实例化异或运算子模块 Combine_bit Cb( .Start(Start), .Clk(Clk), .Reset(Reset), .Secret_Key(Secret_Key), .Plaintext_data(Plaintext_data), .Ciphertext(Ciphertext) ); endmodule
异或运算子模块(修正时序逻辑与位宽)
// ----sub module to combine the bits (secret_key ^ Plaintext_data)------ module Combine_bit( input Clk, input Reset, input [227:0] Secret_Key, // 228位位宽 input [227:0] Plaintext_data, // 228位位宽 input Start, output reg [227:0] Ciphertext // 228位位宽 ); // 时序逻辑:复位清零,Start有效时执行异或运算 always @ (posedge Clk or posedge Reset) begin if (Reset) begin Ciphertext <= 228'd0; // 复位时输出清零,符合常规设计 end else if (Start) begin // 当Start信号有效时,执行异或运算 Ciphertext <= Secret_Key ^ Plaintext_data; end // 如果需要持续输出异或结果(比如Plaintext_data实时变化),可以去掉else if(Start),直接在每个时钟沿计算 end endmodule
额外建议
- 先单独仿真
Combine_bit模块:给它输入固定的228位测试密钥和明文,验证异或逻辑是否正常,再联调顶层模块,这样更容易定位问题。 - 如果你的
Plaintext_data是串行输入(1位/周期),那需要修改为串行处理逻辑:比如用移位寄存器把明文缓存成228位,再和密钥异或,具体逻辑可以根据你的数据流调整。
内容的提问来源于stack exchange,提问作者Muhammad Afnan
相关产品推荐
相关产品推荐

