verilog-将语句reg分配给未分配的输出变量

verilog-将语句reg分配给未分配的输出变量,verilog,fpga,assign,shift-register,Verilog,Fpga,Assign,Shift Register,我试图使用FPGA作为带有pwm的一些LED的移位寄存器,但在尝试将包含移位值的reg分配给输出变量时遇到错误。当我把它上传到FPGA时(我正在使用嵌入式micro的mojo),它什么也不做。当我使用模拟器时,它报告所有的输出变量都没有赋值,并且都有X的值,而模块内的所有其他变量都工作得很好。以下是换档模块的代码: module shifting( input clk, input shiftingpin,//data to be shifted in input rst

我试图使用FPGA作为带有pwm的一些LED的移位寄存器,但在尝试将包含移位值的reg分配给输出变量时遇到错误。当我把它上传到FPGA时(我正在使用嵌入式micro的mojo),它什么也不做。当我使用模拟器时,它报告所有的输出变量都没有赋值,并且都有X的值,而模块内的所有其他变量都工作得很好。以下是换档模块的代码:

module shifting(
    input clk,
    input shiftingpin,//data to be shifted in
    input rst,
    output done,
    output [3:0]data//pwm compare value output
    );
reg [2: 0] ctr_d, ctr_q;
reg don;
reg [3:0]datas;
always @(*) begin
     if(ctr_q == 3'b100) begin
        ctr_d[2:0] = 3'b0;
        don = 1'b1;
     end else begin
       ctr_d = ctr_q + 1'b1;
        don = 1'b0;
     end
end
always @(posedge clk) begin
     datas[ctr_q] = shiftingpin;// assign value to the output
    if (rst) begin
        ctr_q <= 1'b0;
    end else begin
        ctr_q <= ctr_d;
    end
end
assign data = datas;
assign done = don;
endmodule 
模块移位(
输入时钟,
输入shiftingpin,//要移入的数据
输入rst,
输出完成,
输出[3:0]数据//pwm比较值输出
);
注册号[2:0]ctr_d,ctr_q;
雷格登;
reg[3:0]数据;
始终@(*)开始
如果(ctr_q==3'b100)开始
ctr_d[2:0]=3'b0;
don=1'b1;
结束,否则开始
ctr_d=ctr_q+1'b1;
don=1'b0;
结束
结束
始终@(posedge clk)开始
数据[ctr_q]=换档销;//为输出赋值
如果(rst)开始

ctr_q如果我正确理解了这个问题,那么在尝试从
始终
块中驱动端口时,您会出现语法错误

声明端口时,默认情况下它们通常是有线的,只能由端口或分配驱动。产生下面的代码

module shifting(
    input        clk,
    input        shiftingpin,
    input        rst,
    output       done,
    output [3:0] data
);
reg           don; 
reg [3:0]     datas;
assign done = don;    
assign data = datas;
解决方案 解决方案是将端口定义为
reg
,如果可以支持System Verilog,则首选逻辑。
logic
将根据需要有效地在wire和reg之间切换,以简化代码重构

module shifting(
    input             clk,
    input             shiftingpin,
    input             rst,
    output reg        done,
    output reg  [3:0] data
);
always @(posedge clk) begin
 data[ctr_q] <= shiftingpin; // <-- data port used directly
//...
模块移位(
输入时钟,
输入换档销,
输入rst,
输出注册完成,
输出reg[3:0]数据
);
始终@(posedge clk)开始

数据[ctr_q]您可以添加模拟输入的tb代码吗?(还请注意,将换档销存储到数据的行应为非阻塞:
datas[ctr_q]
always @(posedge clk) begin
  datas[3:0] <= {datas[2:0], shiftingpin};